使用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
对象
您可以使用JsonProperty
和JsonIgnore
属性来指导反序列化过程…因此您的模型可以是:
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);