J'ai un cours
public class Order
{
public int Id { get; set; }
public string ShippingMethod { get; set; }
}
et je veux désérialiser les données JSON ci-dessous dans la classe/l'objet ci-dessus
string json = @"{
'Id': 1,
'ShippingMethod': {
'Code': 'external_DHLExpressWorldwide',
'Description': 'DHL ILS Express Worldwide'
}
}";
Mon idée est que ShippingMethod
en JSON est un objet, mais je veux juste arriver à ShippingMethod.Code
(en JSON) qui passera dans ShippingMethod
en tant que string
dans la classe Order
pendant la désérialisation.
comment puis-je atteindre cet objectif en utilisant Json.NET ?
Je crois que je peux l'accompagner en utilisant CustomJsonConverter . Mais je suis confus. L'exemple dans la documentation juste pour WriteJson
, mais pas ReadJson
.
Je viens de résoudre mon problème en utilisant JsonConverter
comme je l'ai mentionné ci-dessus dans ma question. Ci-dessous mon code complet:
public class Order
{
public int Id { get; set; }
[JsonConverter(typeof(ShippingMethodConverter))]
public string ShippingMethod { get; set; }
}
public class ShippingMethodConverter : JsonConverter
{
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Not implemented yet");
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.Null)
{
return string.Empty;
}
else if (reader.TokenType == JsonToken.String)
{
return serializer.Deserialize(reader, objectType);
}
else
{
JObject obj = JObject.Load(reader);
if (obj["Code"] != null)
return obj["Code"].ToString();
else
return serializer.Deserialize(reader, objectType);
}
}
public override bool CanWrite
{
get { return false; }
}
public override bool CanConvert(Type objectType)
{
return false;
}
}
dynamic o = JsonConvert.DeserializeObject(json);
var order = new Order
{
Id = o.Id,
ShippingMethod = o.ShippingMethod.Code
};
Désérialiser l'objet en tant que dynamique, puis remplir l'objet Order
en accédant aux propriétés de l'objet dynamique
Vous pouvez utiliser les attributs JsonProperty
et JsonIgnore
pour diriger le processus de désérialisation ... Votre modèle peut donc être:
public class Order
{
public int Id { get; set; }
[JsonIgnore]
public string ShippingMethod
{
get
{
return (string)TempShippingMethod?["Code"];
}
}
[JsonProperty("ShippingMethod")]
private JObject TempShippingMethod { set; get; }
}
var res = JsonConvert.DeserializeObject<Order>(json);