我正在尝试在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:在目的上省略了尾随的分号
答案 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
。
decodedData
是DataList
,DataList
类的成员data
是List<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();