一尘不染

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

json

我有一堂课

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'
  }
}";

我的想法是ShippingMethod在JSON中是一个对象,但我只想获取ShippingMethod.Code(在JSON中)在反序列化期间将ShippingMethodstringOrder类中那样传递。

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

我相信我可以使用CustomJsonConverter完成它。但是我很困惑。docs中的示例仅用于WriteJson,但不适用ReadJson


阅读 254

收藏
2020-07-27

共1个答案

一尘不染

我只是使用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;
    }
}
2020-07-27