2016-11-05 79 views
3

我有一個類定製反序列化使用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' 
    } 
}"; 

我的想法是,在ShippingMethod是JSON一個對象,但我只想在(JSON中)中進行反序列化,它將在Order類中傳入ShippingMethod,作爲string

我該如何使用Json.NET來實現該目標?

我相信我可以用​​來應付它。但我感到困惑。文檔中的示例僅適用於WriteJson,但不適用於ReadJson

+0

因此,'Code'和'Description'在'ShippingMethod'裏面?如何序列化? – Tinwor

+0

你只需要在同一級別有「Id」和「Code」? – CodeNotFound

+0

是的,那是我的問題,我想完成的事情 – Habibillah

回答

7

I就像我在我的問題中提到的那樣使用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; 
    } 
} 
2

您可以使用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); 
+0

是的,這只是一個小小的破解。我不喜歡這種方式,但我贊成:)作爲我對你的回答的敬意 – Habibillah

+0

@Habibillah我也不喜歡你的回答,對於一件簡單的事情來說太麻煩了,但是作爲我對你的意見的尊重,我發佈了一個簡化我的答案的版本.. –

+0

不用擔心:)。這個問題很簡單,但是我的真正意思是,有很多屬性和糟糕的json模式,這真的很值得。例。保存訂單,您必須傳遞字符串,但爲了獲取訂單細節,您獲得了一個對象。還有更多 – Habibillah

4
dynamic o = JsonConvert.DeserializeObject(json); 
var oder = new Order 
{ 
    Id = o.Id, 
    ShippingMethod = o.ShippingMethod.Code 
}; 

反序列化對象的動態,然後填寫Order通過訪問動態對象屬性的對象

+0

+1。我認爲這是沒有屬性污染和新的班級創作的最好的清潔方式:) – CodeNotFound

+0

謝謝你的回答,但它不適合如果有很多其他屬性 – Habibillah

+0

你還沒有說有更多的屬性來管理。爲了解決這個問題,你可以添加一個映射一次的擴展方法,然後你可以在任何你想要的地方使用它。但是你的解決方案似乎也沒問題,只需要很多代碼fortwo屬性(在我看來) – Tinwor