首页 > 解决方案 > C#中JSON的嵌套反序列化

问题描述

我正在尝试从我的 JSON 响应中检索“数据”的内容。我相信我已经正确地创建了这些类,但是我搞砸了 TechProfile 类的反序列化。尝试设置“techProfile”变量时出现异常。

Newtonsoft.Json.JsonReaderException:'解析值时遇到意外字符:P. 路径'',第 0 行,位置 0。

我不情愿地在 JSONMainResponse.Data 参数的末尾添加了一个 ToString(),因为没有它就无法编译。

我的 JSON:

{
"success":true,
"msg":"",
"data":[
    {"categoryName":"Target platform","option_category_id":"1","skill_optionID":"1","option_type":"Scale","name":"Desktop apps","value":"2"},
    {"categoryName":"Target platform","option_category_id":"1","skill_optionID":"2","option_type":"Scale","name":"Mobile apps","value":"2"},
    {"categoryName":"Target platform","option_category_id":"1","skill_optionID":"3","option_type":"Scale","name":"Server apps","value":"5"},
    {"categoryName":"Target platform","option_category_id":"1","skill_optionID":"4","option_type":"Scale","name":"Hardware dev","value":"2"},
    {"categoryName":"Target platform","option_category_id":"1","skill_optionID":"5","option_type":"Scale","name":"Web dev","value":"0"}
    ]
}

主要代码:

    string result = postData("http://test.com/test.php");

            JSONMain JSONMainResponse = JsonConvert.DeserializeObject<JSONMain>(result);

            string success = JSONMainResponse.Success;
            string msg = JSONMainResponse.Msg;
            TechProfile techProfile = JsonConvert.DeserializeObject<TechProfile>(JSONMainResponse.Data.ToString());

课程:

    public partial class JSONMain
        {
            [JsonProperty("success")]
            public string Success { get; set; }

            [JsonProperty("msg")]
            public string Msg { get; set; }

            [JsonProperty("data")]
            public TechProfile[] Data { get; set; }
        }


    public partial class TechProfile
        {
            [JsonProperty("categoryName")]
            public string CategoryName { get; set; }

            [JsonProperty("option_category_id")]           
            public string OptionCategoryId { get; set; }

            [JsonProperty("skill_optionID")]
            public string SkillOptionId { get; set; }

            [JsonProperty("option_type")]
            public string OptionType { get; set; }

            [JsonProperty("name")]
            public string Name { get; set; }

            [JsonProperty("value")]
            public string Value { get; set; }
        }

标签: c#jsonnesteddeserialization

解决方案


我有点过分了。

对 JSONMain 类的第一个更改:

public List<TechProfile> Data { get; set; }

代替...

public TechProfile[] Data { get; set; }

然后对于主代码,我没有尝试再次反序列化,而是简单地声明了一个基于 JSONMainResponse.Data 的新 TechProfile 列表。见下文

string success = JSONMainResponse.Success;
string msg = JSONMainResponse.Msg;
List<TechProfile> data = JSONMainResponse.Data;

foreach(TechProfile tp in data)
{
    string categoryName = tp.CategoryName;
}

推荐阅读