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

本文关键字:反序列化 JSON 数据 net asp | 更新日期: 2023-09-27 18:18:04

我有以下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);

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

在这种情况下不能使用对象,因为每个对象都有不同的属性名。反序列化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.
    }
}

不能使用包含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; }
}

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

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