C# JSON.NET将列表序列化为父对象的属性

C# JSON.NET将列表序列化为父对象的属性,c#,json,serialization,json.net,C#,Json,Serialization,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 cla

我有一个包含附加信息列表的对象

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; }
}
我知道我的目标看起来很容易出错(列表中有两个ConcreteInformation1对象会导致重复的属性名称),但我简化了我的问题和示例,以便只专注于找到将列表作为属性组合到父对象中的解决方案

我曾尝试编写自己的JsonConverter,但在
o.AddBeforeSelf()
上出现错误,因为JObject.Parent为null

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

尝试将
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字符串中生成具有相同属性名称的多个属性,并且在反序列化过程中会出现问题。

如果将列表更改为
字典
,则可以使用
[JsonExtensionData]
属性获得所需的结果。看看这个,这是可行的,但不幸的是它有一个很大的缺点。。所有开发人员都需要知道,当前结构中的一个对象需要自己的转换器。所有其他对象都使用[JsonProperty]和[JsonIgnore]属性。但目前我看不到任何其他的方法。谢谢
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();
}