【问题标题】:JSON.NET JsonConvert serialization of entity return "[ ]"JSON.NET JsonConvert 序列化实体返回“[ ]”
【发布时间】:2014-10-08 13:29:29
【问题描述】:

我正在使用 JsonConvert.SerializeObject 序列化我的实体对象。

类似的东西:

var test = JsonConvert.SerializeObject(MyEntityObject)

我的测试结果是:

[ { "$id": "1", “一些属性1”:1, “一些属性2”:2, “某物 3”:3, “实体对象1”:空, "entityobject2": null,
"entityobject3": [], “实体键”:空 } ]

问题在于 entityobject3 返回 2 个空方括号而不是 null。当我尝试反序列化时,它会导致我的代码出现问题,它给了我一个 cannot implicitly convert type generic.list to entitycollection 错误。

有没有办法告诉 JsonConver.SerializeObject 忽略那些在 JsonSerializerSettings 中导致我出现问题的实体,因为我反正不需要它们。

【问题讨论】:

    标签: json json.net


    【解决方案1】:

    您可以定义自定义序列化/反序列化

    public abstract class JsonCreationConverter<T> : JsonConverter
    {
        /// <summary>
        /// Create an instance of objectType, based properties in the JSON object
        /// </summary>
        /// <param name="objectType">type of object expected</param>
        /// <param name="jObject">
        /// contents of JSON object that will be deserialized
        /// </param>
        /// <returns></returns>
        protected abstract T Create(Type objectType, JObject jObject);
    
        public override bool CanConvert(Type objectType)
        {
            return typeof(T).IsAssignableFrom(objectType);
        }
    
        public override object ReadJson(JsonReader reader, 
                                        Type objectType, 
                                         object existingValue, 
                                         JsonSerializer serializer)
        {
            // Load JObject from stream
            JObject jObject = JObject.Load(reader);
    
            // Create target object based on JObject
            T target = Create(objectType, jObject);
    
            // Populate the object properties
            serializer.Populate(jObject.CreateReader(), target);
    
            return target;
        }
    
        public override void WriteJson(JsonWriter writer, 
                                       object value,
                                       JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }
    
    public class MyEntityObjectConverter : JsonCreationConverter<MyEntityObject>
    {
        protected override Person Create(Type objectType, JObject jObject)
        {
            if (FieldExists("entityobject3", jObject))
            {
                return new entityobject3();
            }
            else if (FieldExists("Someproperty1", jObject))
            {
                return new Someproperty1();
            }
            else
            {
                return null;
            }
        }
    
        private bool FieldExists(string fieldName, JObject jObject)
        {
            return jObject[fieldName] != null;
        }
    }
    

    然后这样称呼它:

    List<MyEntityObject> myEntityObject = 
        JsonConvert.DeserializeObject<List<MyEntityObject>>(json, new MyEntityObjectConverter());
    

    【讨论】:

      【解决方案2】:

      您可以使用忽略注释来装饰您的属性:

      [JsonIgnore]
      

      您还应该将此添加到您的课程中,以告诉 JSON.Net 您选择退出成员:

      [JsonObject(MemberSerialization.OptOut)]
      

      您还可以编写自定义序列化程序:http://blog.maskalik.com/asp-net/json-net-implement-custom-serialization/。这将是更多的工作,但您可以根据自己的需要严格调整流程。

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 2016-06-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多