2014-09-03 100 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

相关问题