0

我正在尝试在 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"])

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

foreach 语句无法对“ASP._Page_that_cshtml.DataList”类型的变量进行操作,因为“ASP._Page_that_cshtml.DataList”不包含“GetEnumerator”的公共定义

当我尝试以这种方式将解码数据转换为列表时 -

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:故意省略尾随分号

4

5 回答 5

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

应该

var decodedData = JSON.Decode<List<Data>>(Request["data"])
var myDataList = new DataList() { data = decodedData; }
于 2013-03-18T16:24:10.440 回答
1

尝试迭代decodedData.data

decodedData是 a DataList,并且DataList该类有一个成员data是 a List<Data>List<Data>有一个GetEnumerator方法,由foreach.

或者,您可以添加一个GetEnumerator方法DataList

public IEnumerator GetEnumerator() { return data.GetEnumerator(); }
于 2013-03-18T16:22:14.963 回答
1

您的示例无效 json。您应该有一个[]列表集合:

data: {
    "user_id": 1,
    "taskid": "1234",
    "list": [
        {
            "one": 1,
            "two": 2
        },
        {
            "one": 1,
            "two": 2
        }
    ]
}
于 2013-03-18T16:23:26.897 回答
1

您得到的第一个错误是非常正确的,您的类DataList不包含GetEnumeratorforeach 语句所需的定义。您将需要迭代该属性,因此迭代decodedData.data。

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

于 2013-03-18T16:23:53.143 回答
0

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

var dataArray = JSON.Decode<Data[]>(Request["data"]);
var list = dataArray.ToList();
于 2013-03-18T16:25:26.177 回答