Используйте пользовательские 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
только во время десериализации.
«JsonConverter» работает из коробки и не вводит никаких дополнительных свойств! благодаря –