【问题标题】:Decode nested JSON objects in C#在 C# 中解码嵌套的 JSON 对象
【发布时间】:2013-03-18 16:20:32
【问题描述】:

我正在尝试在 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'

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

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

我又抛出一个错误

CS0030:无法将类型“ASP._Page_that_cshtml.DataList”转换为“System.Collections.Generic.List&lt;ASP._Page_that_cshtml.DataList&gt;

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

PS:故意省略尾随分号

【问题讨论】:

    标签: c# javascript asp.net json


    【解决方案1】:
    List<Data> decodedData = JSON.Decode<DataList>(Request["data"])
    

    应该是

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

    【讨论】:

    • 太棒了!很高兴它有帮助:)
    【解决方案2】:

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

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

    【讨论】:

    • 实际上它是有效的 JSON 使用(将其字符串化以发布到服务器) - { "user_id": 1, "taskid": "1234", "list": { "item-1": { "一": 1, "二": 2 }, "item-2": { "一": 1, "二": 2 } } }
    • @Peter,我明白了。好的,集合的语法看起来仍然应该有方括号来表示集合。
    【解决方案3】:

    您遇到的第一个错误非常正确,您的类 DataList 不包含 foreach 语句所需的 GetEnumerator 定义。您将需要遍历该属性,因此请遍历 decodedData.data。

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

    【讨论】:

      【解决方案4】:

      尝试迭代 decodedData.data

      decodedData 是一个DataListDataList 类有一个成员data,它是一个List&lt;Data&gt;List&lt;Data&gt; 有一个GetEnumerator 方法,正如foreach 所要求的那样。

      或者,您可以将GetEnumerator 方法添加到DataList

      public IEnumerator GetEnumerator() { return data.GetEnumerator(); }
      

      【讨论】:

      • 谢谢蒂姆,但抛出一个错误,说“数据”未定义
      • @Peter:尝试公开数据
      • 或者,添加一个方法来公开枚举器(参见我的编辑)
      • 谢谢,但是当我将该方法添加到 DataList 时,我得到 - CS0305: Using the generic type 'System.Collections.Generic.IEnumerator' requires 1 type arguments - 我尝试使用 IEnumerator 但是“System.NullReferenceException:对象引用未设置为对象的实例。”在 data.GetEnumerator
      【解决方案5】:

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

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

      【讨论】:

      • 谢谢,但是“System.MissingMethodException: 没有为 'ASP._Page_that_cshtml+Data[]' 类型定义无参数构造函数。”
      • 使用JSON.net library 可能更容易,它提供了一套非常全面的API 来处理JSON 数据。我在我所有的项目中都使用它,而且我从来没有遇到过任何问题。此外,它比内置的 C# JSON 序列化程序性能要高得多。在您的情况下,您可以像这样使用它List&lt;Data&gt; products = JsonConvert.DeserializeObject&lt;List&lt;Data&gt;&gt;(Request["data"]);
      • 谢谢。但正如 David Tryon 指出的那样,我没有使用有效的 JSON,而且它有问题
      • 当然...但是如果您要处理大量 JSON 数据,最好使用 JSON.Net 库。
      猜你喜欢
      • 1970-01-01
      • 2020-05-02
      • 2011-12-09
      • 2021-08-25
      • 2016-08-09
      • 2021-11-02
      • 1970-01-01
      • 2014-02-11
      • 2020-07-07
      相关资源
      最近更新 更多