2014-10-13 1 views
1

У меня есть следующая структура классов. То, чего я пытаюсь достичь, вместо Bar сериализован как объект в JSON, сериализуем как строку со своим внутренним свойством Name значением и игнорируем свойство Id. И у меня нет сценария, где мне нужно десериализовать его, но я должен загрузить объекты Bar из базы данных с другими свойствами и сделать некоторые внутренние манипуляции, но не использовать их для транспорта.Как сериализовать объект для свойства строки JSON вместо объекта с помощью Json.Net

class Foo 
{ 
    [JsonProperty("bar")] 
    public Bar Bar { get; set; } 
} 

class Bar 
{ 
    [JsonIgnore] 
    public Guid Id { get; set; } 
    [JsonProperty] 
    public string Name { get; set; } 
} 

Ожидаемый JSON:

{ 
    bar: "test" 
} 

ответ

2

Используйте пользовательские JsonConverter и вы можете контролировать ваши преобразования для вывода, что вы хотите.

Что-то вроде:

public class BarConverter : JsonConverter 
    { 

     public override bool CanConvert(Type objectType) 
     { 
      return objectType == typeof(Bar); 
     } 

     public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
     { 
      var bar = value as Bar; 
      serializer.Serialize(writer, bar.Name); 
     } 

     public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
     { 
       // Note: if you need to read to, you'll need to implement that here too 
       // otherwise just throw a NotImplementException and override `CanRead` to return false 
       throw new NotImplementedException(); 
     } 
    } 

Затем вы можете украсить вашу собственность или Bar класс (в зависимости от того, всегда ли вы хотите Bar сериализовать, как это, или только для этого объекта) с JsonConverterAttribute:

[JsonConverter(typeof(BarConverter))] 
public Bar Bar { get; set; } 

Или:

[JsonConverter(typeof(BarConverter))] 
public class Bar 

Другим «быстрый и грязный» способ сделать это просто иметь тени свойства, которое будет сериализовано:

public class Foo 
{ 
    [JsonProperty("bar")]   // this will be serialized as "bar" 
    public string BarName 
    { 
     get { return Bar.Name; } 
    } 

    [JsonIgnore]     // this won't be serialized 
    public Bar Bar { get; set; } 
} 

Примечания, если вы хотите, чтобы иметь возможность читать то вы должны были бы обеспечить сеттер также и выяснить, как преобразовать имя строки обратно в экземпляр Bar. Вот где быстрое и грязное решение становится немного неприятным, потому что у вас нет простого способа ограничить настройку BarName только во время десериализации.

+0

«JsonConverter» работает из коробки и не вводит никаких дополнительных свойств! благодаря –