簡體   English   中英

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

[英]Custom Deserialization using 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解決了我的問題。 在我完整的代碼下面:

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

將對象反序列化為動態對象,然后通過訪問動態對象屬性來填充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<Order>(json);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM