2016-11-16 46 views
0

我有以下JSON數據,類和代碼,但它不起作用。我得到3個對象的列表,但都是NULL。任何人都可以建議我在這裏失去什麼?如何反序列化asp.net中的JSON數據?

JSON數據:

[ 
    { 
     "donotpostalmail": { 
      "Do Not Allow": { 
       "Do Not Allow": 1 
      }, 
      "Allow": { 
       "Allow": 0 
      } 
     } 
    }, 
    { 
     "familystatuscode": { 
      "Single": { 
       "Single": 1 
      }, 
      "Married": { 
       "Married": 2 
      }, 
      "Divorced": { 
       "Divorced": 3 
      }, 
      "Widowed": { 
       "Widowed": 4 
      } 
     } 
    }, 
    { 
     "preferredcontactmethodcode": { 
      "Any": { 
       "Any": 1 
      }, 
      "Email": { 
       "Email": 2 
      }, 
      "Phone": { 
       "Phone": 3 
      }, 
      "Fax": { 
       "Fax": 4 
      }, 
      "Mail": { 
       "Mail": 5 
      } 
     } 
    } 
] 

類:

public class ResponseDataOfOptions 
{ 
    public OptionsList mainList { get; set; } 
} 
public class OptionsList 
{ 
    public Dictionary<string, Options> optionList { get; set; } 
} 
public class Options 
{ 
    public Dictionary<string, int> options { get; set; } 
} 

.cs文件代碼:

List<ResponseDataOfOptions> optionList = JsonConvert.DeserializeObject<List<ResponseDataOfOptions>>(objResponse.ResponseDataOfOptions); 
+0

我相信您的問題映射響應到字典。你有沒有嘗試過使用類似http://json2csharp.com來構建類?無可否認,我之前沒有與Json - > dict合作過,但那應該是問題。 –

+0

我試過了。它爲我提供了非常差的JSON級別。所以,我嘗試了我自己。通常,如果JSON基於Dictionary,json2csharp.com不會提供更好的解決方案。 –

+3

您的對象模型絕不代表您的JSON數據 - 您如何期望任何解串器知道在哪裏放置什麼值? – Jamiec

回答

2

在這種情況下,您不能使用對象,因爲每個對象都有不同的屬性名稱。反序列化這個JSON的唯一方法如下。

JsonConvert.DeserializeObject<List< 
     Dictionary<string, 
      Dictionary<string, 
       Dictionary<string, int> 
      > 
     > 
>>(objResponse.ResponseDataOfOptions); 

這是一個詞典列表,實際上有三個級別的詞典。處理數據並不是一個非常友好的結構,但會執行反序列化。

您可能還有興趣使用JObjectJToken進行一些屬性檢測,然後給適當的數據傳輸對象充氣。

JObject list = JObject.Parse(objResponse.ResponseDataOfOptions); 
foreach (var item in list) { 
    JToken token = jobj["donotpostalmail"]; 
    if (token != null) { 
     // inflate the corresponding data type. 
    } 
} 
+0

我已經在單獨的類中創建了與此處表示的字典相同的字典。我想我已經嘗試過了。讓我再嘗試一次。 –

+1

由於屬性名稱不同,您不能使用數據傳輸對象。儘管解析JSON可能對你有幫助,但我還是把它添加到了答案中。 – jorgonor

+0

我已經使用了第一種方法。它工作正常。如果班級結構是可能的,這將是非常有幫助的。那麼,這是一個巨大的解決方案。謝謝。 –

0

請檢查您的JSON字符串objResponse.ResponseDataOfOptions格式是否正確,也許有一些&quot;在你的字符串中,如果是的話,你需要替換這些&quot;如下:

List<ResponseDataOfOptions> optionList = JsonConvert.DeserializeObject<List<ResponseDataOfOptions>>(objResponse.ResponseDataOfOptions.Replace("&quot;", "\"")); 
+0

問題在於字典中的JSON字符串,而不是'optionList'爲空。 –

1

不能使用含有3種不同類型的對象的數組。 如果你想這樣做,我建議,而不是使用數組的容器對象:

{ 
    "responseDataOfOptions": { 
     "donotpostalmail": { 
      "Do Not Allow": { 
       "Do Not Allow": 1 
      }, 
      "Allow": { 
       "Allow": 0 
      } 
     } 
    }, 
    "optionsList": { 
     "familystatuscode": { 
      "Single": { 
       "Single": 1 
      }, 
      "Married": { 
       "Married": 2 
      }, 
      "Divorced": { 
       "Divorced": 3 
      }, 
      "Widowed": { 
       "Widowed": 4 
      } 
     } 
    }, 
    "options": { 
     "preferredcontactmethodcode": { 
      "Any": { 
       "Any": 1 
      }, 
      "Email": { 
       "Email": 2 
      }, 
      "Phone": { 
       "Phone": 3 
      }, 
      "Fax": { 
       "Fax": 4 
      }, 
      "Mail": { 
       "Mail": 5 
      } 
     } 
    } 
} 

相應的C#類必須是這樣的:

public class JsonResponse { 
    public ResponseDataOfOptions responseDataOfOptions{ get; set; } 
    public OptionsList optionsList{ get; set; } 
    public Options options { get; set; } 
} 
+0

謝謝。如果沒有解決方案,這是其中之一。但我得到了解決方案。 –