使用Json.NET自定义反序列化

我上课了

public class Order { public int Id { get; set; } public string ShippingMethod { get; set; } } 

我想将下面的JSON数据反序列化为上面的类/对象

 string json = @"{ 'Id': 1, 'ShippingMethod': { 'Code': 'external_DHLExpressWorldwide', 'Description': 'DHL ILS Express Worldwide' } }"; 

我的想法是JSON中的ShippingMethod是一个对象,但我只想获得ShippingMethod.Code (在JSON中),它将在反序列化期间作为Order类中的string传递给ShippingMethod

如何使用Json.NET实现这一目标?

我相信我可以使用CustomJsonConverter来完成它。 但我感到困惑。 文档中的示例仅适用于WriteJson ,但不适ReadJson

我正如我在上面提到的问题中JsonConverter那样使用JsonConverter来解决我的问题。 在我的完整代码下面:

 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 oder = new Order { Id = o.Id, ShippingMethod = o.ShippingMethod.Code }; 

将对象反序列化为动态,然后通过访问动态对象属性来填充Order对象

您可以使用JsonPropertyJsonIgnore属性来指导反序列化过程…因此您的模型可以是:

 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(json);