如何在asp.net中反序列化JSON数据?

时间:2016-11-16 09:56:52

标签: c# asp.net json

我有以下JSON数据,类和代码,但它没有工作。我得到3个对象列表,但都是NULL。任何人都可以建议我在这里缺少什么?

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

3 个答案:

答案 0 :(得分: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.
    }
}

答案 1 :(得分: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; }
}

答案 2 :(得分:0)

请检查您的json字符串objResponse.ResponseDataOfOptions格式是否正确,可能您的字符串中有一些&quot;,如果是,则需要替换这些&quot;,如下所示:

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