Json.Net: propriété Serialize / Deserialize sous forme de valeur, pas d’object

Comment puis-je obtenir la représentation JSON suivante de la classe Id lorsqu’elle est utilisée dans une autre classe?

class Car { public SsortingngId Id { get; set; } public ssortingng Name { get; set; } } class SsortingngId { public ssortingng Value { get; set; } } // --------------------------------------------- // Desired representation { "Id": "someId", "Name": "Ford" } // Default (undesired) representation { "Id" : { "Value": "someId" }, "Name": "Ford" } 

Vous pouvez append un TypeConverter pour SsortingngId . Json.NET prendra le convertisseur de type et l’utilisera pour le convertir de et vers une chaîne:

 [TypeConverter(typeof(SsortingngIdConverter))] class SsortingngId { public ssortingng Value { get; set; } } class SsortingngIdConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(ssortingng)) return true; return base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(SsortingngId)) return true; return base.CanConvertTo(context, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) { if (value is ssortingng) { return new SsortingngId { Value = (ssortingng)value }; } return base.ConvertFrom(context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) { if (destinationType == typeof(ssortingng) && value is SsortingngId) { return ((SsortingngId)value).Value; } return base.ConvertTo(context, culture, value, destinationType); } } 

Si votre représentation sous forme de chaîne contient des données numériques incorporées ou des données de date / heure, veillez à convertir ces données en utilisant la culture transmise plutôt que la culture par défaut, la culture actuelle. Json.NET appellera le convertisseur avec la culture correcte, qui est la culture invariante par défaut , garantissant ainsi que les fichiers JSON générés sont portables entre les cultures.

Échantillon de violon .

Notez toutefois que, si vous utilisez .Net Core, la prise en charge des convertisseurs de type n’a été ajoutée qu’à partir de Json.NET 10.0.1 . Et la prise en charge des convertisseurs de type dans les versions de Json.NET Portable n’est plus disponible à partir de 10.0.3.

Sinon, si cela ne vous dérange pas d’append des atsortingbuts spécifiques à Json.NET à votre type, vous pouvez utiliser un JsonConverter personnalisé :

 [JsonConverter(typeof(SsortingngIdConverter))] class SsortingngId { public ssortingng Value { get; set; } } class SsortingngIdConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(SsortingngId); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (reader.TokenType == JsonToken.Null) return null; var token = JToken.Load(reader); return new SsortingngId { Value = (ssortingng)token }; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var id = (SsortingngId)value; writer.WriteValue(id.Value); } } 

Vous pouvez également définir le convertisseur dans les parameters globaux .

Échantillon de violon .

Vous pouvez remplacer la méthode ToSsortingng de la classe SsortingngId pour renvoyer la valeur.

  public override ssortingng ToSsortingng() { return this.Value; } 

Vous aurez besoin d’un TypeConverter plus tard pour désérialiser d’une chaîne en SsortingngId

 public class SsortingngIdConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(ssortingng)) { return true; } return base.CanConvertFrom(context, sourceType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { if (value is ssortingng) { return new SsortingngId(value.ToSsortingng()); } return base.ConvertFrom(context, culture, value); } } 

Et décorez votre classe SsortingngId avec cet atsortingbut

 [TypeConverter(typeof(SsortingngIdConverter))] public class SsortingngId{ ... }