2016-09-06 83 views
1

我有以下的JSON:反序列化JSON屬性作爲布爾或雙

"rates": { 
     "AT": { 
      "country": "Austria", 
      "standard_rate": 20.00, 
      "reduced_rate": 10.00, 
      "reduced_rate_alt": 13.00, 
      "super_reduced_rate": false, 
      "parking_rate": 12.00 
     }, 
     "DK": { 
      "country": "Denmark", 
      "standard_rate": 25.00, 
      "reduced_rate": false, 
      "reduced_rate_alt": false, 
      "super_reduced_rate": false, 
      "parking_rate": false 
     }, 
} 

而且我有下面的類反序列化JSON:

public string country { get; set; } 
    public double standard_rate { get; set; } 
    //public string reduced_rate { get; set; } 
    private double _reduced_rate; 

    public double reduced_rate 
    { 
     get { return _reduced_rate; } 
     set 
     { 
      bool isDouble = Double.TryParse(value.ToString(), out _reduced_rate); 
      if (isDouble) 
       _reduced_rate = value; 
      else 
       _reduced_rate = 0.0; 
     } 
    } 

    public string reduced_rate_alt { get; set; } 
    public string super_reduced_rate { get; set; } 
    public string parking_rate { get; set; } 

而當reduce_rate值是false我想設置一個0.0其他的雙值。但是在設置方法中永遠不會進入else

有沒有解決這種情況的另一種方法?

+1

那麼在setter中'value'的值是'double',那麼爲什麼你會希望*不能解析它呢?你絕對需要使用這個JSON嗎?擁有一個既可以是雙精度值也可以是布爾值的屬性對我來說似乎很可怕。您可能會發現擁有兩階段流程是最簡單的,首先將其轉換爲明智的JSON。另外,我強烈建議您遵循您的屬性的.NET命名約定,並使用屬性指定它們在JSON中的序列化方式。 –

+0

來自https://euvatrates.com/rates.json的json源代碼。我無法改變json –

+0

它已經做到了你想要的。如果你想測試它,你可以編寫統一測試並傳遞模擬JSON數據,而不是從實際源代碼中獲取它。 – CarbineCoder

回答

3

處理此問題的一種方法是將reduced_rate_alt定義爲字符串,然後定義一個新屬性,該屬性讀取並嘗試將其解析爲getter中的值。這可以工作,但你有幾個這樣的,因爲使用JSON.NET,同樣應該轉換器與他們的工作,我會手動將這些屬性:

[JsonConverter(typeof(RateJsonConverter))] 
public decimal reduced_rate_alt { get; set; } 

點綴其中每個可能會返回錯誤的屬性具有該屬性。這告訴JSON.NET您提供的代碼反序列化此屬性。當你在這裏時,你可能還想修改[JsonProperty]的屬性名稱。

規則/轉換工具只是使用0代表false,否則爲值。只要轉換規則對所有這些轉換規則都是相同的,則可以爲每個屬性使用相同的轉換器。我也將類型更改爲十進制,這可能更適合於這些。

public class RateJsonConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { // name used in a previous answer 
     return (objectType == typeof(VRate)); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, 
           object existingValue, JsonSerializer serializer) 
    { 
     var token = JToken.Load(reader); 
     decimal d = 0M; 

     Decimal.TryParse(token.ToString(), out d);   
     return d; 
    } 

    public override void WriteJson(JsonWriter writer, object value, 
        JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

測試:

var rates = JsonConvert.DeserializeObject<VRates>(jstr).rates; 

foreach (KeyValuePair<string, VRate> kvp in rates) 
{ 
    Console.WriteLine("key: {0} ({1}), reduced alt rate: {2}", kvp.Key, 
     kvp.Value.country, 
     kvp.Value.reduced_rate_alt.ToString("F2")); 
    kvp.Value.VTag = kvp.Key; 
} 

輸出前幾個:

鍵:AT(奧地利),降低ALT率:13.00
鍵:BE(比利時),減少alt rate:6.00
關鍵字:BG(保加利亞),降低ALT:0.00
關鍵:CY(塞浦路斯),降低ALT:5.00
鍵:CZ(捷克共和國),降低ALT率:10.00
鍵:DK(丹麥),降低ALT率:0.00

BG和DK都是假的,並轉換爲0,而其他有率在JSON中列出。