2014-10-08 70 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());