2014-09-03 118 views
2

我有一個包含附加信息列表的對象。JSON.NET序列化列表作爲父對象的屬性

public class ParentObject 
{ 
    public string Prop1{ get; set; } 
    public string Prop2{ get; set; } 
    public IList<BaseInformation> AdditionalInformation{get;set;} 
} 

public abstract class AbstractInformation {} 

public class ConcreteInformation1 : AbstractInformation 
{ 
    public string Concrete1Extra1{ get; set; } 
    public string Concrete1Extra2{ get; set; } 
} 
public class ConcreteInformation2 : AbstractInformation 
{ 
    public string Concrete2Extra1{ get; set; } 
} 

我想有這樣的

{ 
    "Prop1": "MyValue1", //From ParentObject 
    "Prop2": "MyValue2", //From ParentObject 
    "Concrete1Extra1" : "Extra1" // From ConcreteInformation1 
    "Concrete1Extra2" : "Extra2" // From ConcreteInformation1 
    "Concrete2Extra1" : "Extra3" // From ConcreteInformation2 
} 

我知道我的目標看起來很容易出錯(有兩個名單中ConcreteInformation1對象將導致重複屬性名稱)的JSON對象,但我simpified我的問題和示例,以便只關注找到將列表作爲屬性組合到父對象中的解決方案。

我試圖寫我自己的JsonConverter,但這是o.AddBeforeSelf()錯誤,因爲JObject.Parent爲空。

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    JToken t = JToken.FromObject(value); 

    if (t.Type != JTokenType.Object) 
    { 
     t.WriteTo(writer); 
    } 
    else 
    { 
     JObject o = (JObject)t; 

     o.AddBeforeSelf(new JProperty("PropertyOnParent", "Just a test")); 

     o.WriteTo(writer); 
    } 
} 
+0

如果您將列表更改爲'Dictionary ',您可以使用'[JsonExtensionData]'屬性獲得想要的結果。請參閱此[問題](http://stackoverflow.com/q/14893614/10263)和[答案](http://stackoverflow.com/a/23786127/10263)。 – 2014-09-03 18:58:56

回答

1

嘗試改變WriteJson方法是這樣的:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
{ 
    if (value == null || !(value is ParentObject)) 
     return; 

    var pObject = (ParentObject) value; 

    writer.WriteStartObject(); 

    writer.WritePropertyName("Prop1"); 
    writer.WriteValue(pObject.Prop1); 
    writer.WritePropertyName("Prop2"); 
    writer.WriteValue(pObject.Prop2); 

    foreach (var info in pObject.AdditionalInformation) 
    { 
     JObject jObj = JObject.FromObject(info); 
     foreach (var property in jObj.Properties()) 
     { 
      writer.WritePropertyName(property.Name); 
      writer.WriteValue(property.Value); 
     } 
    } 

    writer.WriteEndObject(); 
} 

但正如你所說,有從集合中同一類型的多個對象時要小心。它將在json字符串中生成具有相同屬性名稱的多個屬性,並且在反序列化過程中會遇到問題。

+0

這可行,但不幸的是它有一個很大的缺點。所有的開發人員都需要知道,當前結構中的一個對象需要自己的轉換器。所有其他對象都與[JsonProperty]和[JsonIgnore]屬性一起使用。但目前我還沒有看到其他方式。謝謝! – hwcverwe 2014-09-04 09:33:11

相關問題