2014-09-03 3 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; } 
} 

Я хочу иметь объект JSON, как этот

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

Я знаю, моя цель выглядит очень подвержен ошибкам (Having два объекта ConcreteInformation1 в списке будут вызывать повторяющиеся имена свойств), но я Simpified мой вопрос и пример, чтобы сосредоточиться только на поиске решения для объединения списка как свойств в родительский объект.

Я попытался написать свой собственный 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); 
    } 
} 
+0

Если вы изменили свой список на 'Dictionary ', вы можете получить результат, который хотите использовать с атрибутом '[JsonExtensionData]'. См. Этот вопрос [http://stackoverflow.com/q/14893614/10263] и [ответ] (http://stackoverflow.com/a/23786127/10263). –

ответ

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

Смежные вопросы