Code Bye

JSON解析问题

JSON String :
{
“errno”: 0,
“info”: {
“10”: [
{
“ad_id”: “1”,
“com_id”: “10”,
“pr_id”: “0”,
“name”: “部门1”,
“info”: “”
},
{
“ad_id”: “2”,
“com_id”: “10”,
“pr_id”: “1”,
“name”: “部门2”,
“info”: “”
},
{
“ad_id”: “3”,
“com_id”: “10”,
“pr_id”: “1”,
“name”: “部门3”,
“info”: “”
}
]
}
}
这是通过http post返回的值,为了便于理解,通过Newtonsoft.Json.dll中的方法转换为了object。假如没有红色部分,可用下面的形式得到对象
需要的对象
        public class Rtn1
        {
            public string errno;
            public dept info = new dept();
        }
        public class dept
        {
            public string ad_id;
            public string com_id;
            public string pr_id;
            public string name;
            public string info; 
        }

在post返回后,strRtn为Json字符串

Rtn1 rtn = (Rtn1)JsonConvert.DeserializeObject(strRtn,typeof(Rtn1));

但是,问题中这个的Json格式,其中的“10”,为com_id,是一个值。目前只有一个“10”,在未来可能还会有“11”,“12”,等等。
本人想问问,对于这种格式的Json字符串,怎么能够解析成对象?
望明白人士,给予解答,谢谢!

解决方案

10

不能反序列化为对象。就算是 json 的天然的父亲——javascript,也不支持这种东西啊。设计这个 json 串的人就是 250,找麻烦。

20

        public class Rtn1
        {
            public string errno;
            public Dictionary<string, dept[]> info = new Dictionary<string, dept[]>();
            //public dept info = new dept();
        }
        public class dept
        {
            public string ad_id;
            public string com_id;
            public string pr_id;
            public string name;
            public string info;
        }
            Rtn1 rtn = (Rtn1)JsonConvert.DeserializeObject(strRtn, typeof(Rtn1));
            Console.WriteLine(rtn.info["10"][1].name); //部门2

10

            public Dictionary<string, dept[]> info = new Dictionary<string, dept[]>();
写成
public Dictionary<string, dept[]> info;
就可以了

10

…数组里有comid为什么属性里还要放comid?
假如是需要comid先做点什么..可以给这个json加上一列comid属性咯

30

Dictonary<string, T> 并不是一个跨平台的技术概念,给你做设计的人一定不是做过跨平台的系统通讯规范设计的。
要保证跨平台,甚至 List<T> 这种设计都应该避免,而应该按照 T[ ] 数组规范去设计协议。例如最基本的类型是
public class DeptGroup
{
    public string com_id;
    public Dept[ ] depts;
}

20

使用 rtn.info[“10“] 来访问只是原因是已知有 10 这个键
遍历的话就
foreach(var x in rtn.info)
{
x.Key 就是键(10、11、12)
x.Value 就是 对应的 dept 数组了

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明JSON解析问题