在C#中解码嵌套的JSON对象

时间:2013-03-18 16:20:33

标签: c# javascript asp.net json

我正在尝试在ASP.NET服务器上转换嵌套的JSON对象。传入的JSON字符串看起来像这样 -

data: {
   user_id: 1,
   taskid: "1234",
   list: {
       "item-1": { one: 1, two: 2 },
       "item-2": { one: 1, two: 2 }   
       //.. where number of items is unknown
   }
}

我尝试使用JSON.Decode这种方式解码数据

public class Data {
    public int user_id { get; set; }
    public string taskid { get; set; }
    public List<object> list { get; set; }
}

public class DataList {
    List<Data> data { get; set; }
}

// if isPost etc..

var decodedData = JSON.Decode<DataList>(Request["data"])

但是当我尝试迭代decodeData时,我收到了一个错误 -

  

foreach语句不能对类型的变量进行操作   'ASP._Page_that_cshtml.DataList'因为   'ASP._Page_that_cshtml.DataList'不包含公共定义   'GetEnumerator'

当我尝试以这种方式将decodeData转换为List时 -

List<Data> decodedData = JSON.Decode<DataList>(Request["data"])

我抛出另一个错误

  

CS0030:无法将类型“ASP._Page_that_cshtml.DataList”转换为“System.Collections.Generic.List<ASP._Page_that_cshtml.DataList>

您能否建议一种合适的方法将嵌套的JSON对象转换为C#对象并迭代它?

PS:在目的上省略了尾随的分号

5 个答案:

答案 0 :(得分:2)

List<Data> decodedData = JSON.Decode<DataList>(Request["data"])

应该

var decodedData = JSON.Decode<List<Data>>(Request["data"])
var myDataList = new DataList() { data = decodedData; }

答案 1 :(得分:1)

尝试迭代decodedData.data

decodedDataDataListDataList类的成员dataList<Data>。根据{{​​1}}的要求,List<Data>GetEnumerator方法。

或者,您可以向foreach添加GetEnumerator方法:

DataList

答案 2 :(得分:1)

您的示例不是valid json。您应该有一个集合[]列表:

data: {
    "user_id": 1,
    "taskid": "1234",
    "list": [
        {
            "one": 1,
            "two": 2
        },
        {
            "one": 1,
            "two": 2
        }
    ]
}

答案 3 :(得分:1)

您收到的第一个错误是正确的,您的类DataList不包含foreach语句所需的GetEnumerator定义。您将需要遍历该属性,因此迭代decodeData.data。

第二个错误再次正确,因为您正在尝试将DataList转换为List类型,C#不知道该怎么做。您将再次需要创建DataList,然后将属性数据设置为List类型。

答案 4 :(得分:0)

您可以尝试将JSON解码为Data对象数组,然后在该数组上调用ToList()扩展方法。

var dataArray = JSON.Decode<Data[]>(Request["data"]);
var list = dataArray.ToList();