2014-10-08 65 views
0

我用JsonConvert.SerializeObject序列化我的实体对象。JSON.NET实体返回的JsonConvert序列化“[]”

类似的东西:

变种测试= JsonConvert.SerializeObject(MyEntityObject)

我的测试的结果是:

[ { “$ ID”: “1”, “Someproperty1”:1, “Someproperty2”:2, “Someproperty3”:3, “entityobject1”:空, “entityobject2”:空,
“entityobject3”:[], “的EntityKey”:空 } ]

问题是与entityobject3返回箱空的方括号的而不是空。它导致我在我的代码更远,当我试图反序列化它给我一个不能隐式地将类型generic.list转换为entitycollection错误。

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

[JsonIgnore] 

你也应该添加到您的类来告诉JSON.Net,你选择退出的成员:

[JsonObject(MemberSerialization.OptOut)] 

回答

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());