2016-11-16 51 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

谢谢。如果没有解决方案,这是其中之一。但我得到了解决方案。 –