【问题标题】:How should one interpret this JSON structure?应该如何解释这种 JSON 结构?
【发布时间】:2014-11-13 21:59:49
【问题描述】:

我刚刚开始使用 JSON,在阅读了几篇文章之后,我仍然不清楚我是在查看数组、列表还是只是一个对象。看起来像这样。

{
  "list": [{
    "fields": {
      "id": "9222115557374550596",
      ...
    },
  },
  {
    "fields": {
      "id": "9222115557374550597",
      ...
    },
  }],
  "paging": {
    "pageCurrent": 0,
    "itemMin": 0,
    "itemMax": 2,
    "maxNextPages": 0,
    "pageSize": 100
  }
}

我想将它反序列化为一个类型的对象列表(或 IEnumerable),以便有一个 Id 属性(也许不是 all 必须将字段解析到对象中)。

当我尝试使用以下代码执行此操作时:

List<Some> somes = JsonConvert.DeserializeObject<List<Some>>(dataAbove);

class Some { public String Id { get; set; } }

我收到一条很长的错误消息,说我没有使用正确的类型和数组以及一堆其他让我感到困惑的东西。我是在正确的轨道上还是我完全迷路了?!

我知道它的根目录是 list。但是什么?!或者至少 - 我应该用谷歌搜索什么?!

无法将当前 JSON 对象(例如 {\"name\":\"value\"})反序列化为类型 'System.Collections.Generic.List`1[ScriveProxy.Template]',因为该类型需要 JSON 数组(例如 [1,2,3])以正确反序列化。\u000d\u000a要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型以使其正常可以从 JSON 对象反序列化的 .NET 类型(例如,不是像整数这样的原始类型,不是像数组或列表这样的集合类型)。 JsonObjectAttribute 也可以添加到类型中,以强制它从 JSON 对象反序列化。\u000d\u000aPath 'list',第 1 行,第 8 位。"

不能是this one,因为外括号是花括号而不是方括号...

this solution 中,我们最终得到一个对象,而不是数组,所以这也不是我的目标。

【问题讨论】:

    标签: c# arrays json parsing json.net


    【解决方案1】:

    在您的情况下,"list""fields" 对象的数组。

    "paging" 是一个对象。

    "list"` and "paging"` 都在一个未命名的根对象中。

    工作 dotNetFiddle:https://dotnetfiddle.net/4qLTvq

    在上面小提琴的控制台窗格中查看输出。

    以下是您应该如何声明您的类以将此特定 JSON 反序列化为 C# 类。

    public class Fields
    {
        public string id { get; set; }
    }
    
    public class TheFields
    {
        public Fields fields { get; set; }
    }
    
    public class Paging
    {
        public int pageCurrent { get; set; }
        public int itemMin { get; set; }
        public int itemMax { get; set; }
        public int maxNextPages { get; set; }
        public int pageSize { get; set; }
    }
    
    public class RootObject
    {
        [Newtonsoft.Json.JsonPropertyAttribute("list")] 
        public List<TheFields> FieldsList { get; set; }
        public Paging paging { get; set; }
    }
    

    这就是你将如何反序列化整个事情。

    var rootObject = JsonConvert.DeserializeObject<RootObject>(jsonString);
    

    由于List 是关键字,为了避免混淆和冲突,我将其名称更改为FieldsList,并将List 类重命名为TheFields 类。您可以选择您认为合适的任何其他名称。

    ObjectArray 的解释

    对象是一组无序的名称/值对。对象以 {(左大括号)开始,以 }(右大括号)结束。每个名称后跟 :(冒号),名称/值对用 ,(逗号)分隔。

    数组是值的有序集合。数组以 [(左括号)开头,以 ](右括号)结尾。值用 ,(逗号)分隔。

    来源:http://www.json.org/

    【讨论】:

    • 我是否在调用时控制数据字符串的获取和格式化方式?或者,如果服务器给我外卷曲,我就不能把它们当成方形,句号? +1 教学方法和图片!
    • 通常调用者(您的代码)无法控制发送者(发送 JSON 的服务器/代码)。我使用这个站点 => json2csharp.com 从给定的 JSON(应该是有效的)字符串生成正确的 C# 类。
    • 我在我的答案中添加了一个有效的 dotNetFiddle。看看这个。一切都很好! dotnetfiddle.net/4qLTvq
    • 哦,在像白痴一样看了一个小时后,我意识到了问题 - 我的 DataMember 无法正常工作......你的意思是我必须使用 JsonPropertyAttribute 而不是 DataMemberlist 映射到 Donkey?!这样的信息应该出现在某处......就像文档或其他东西...... :) 但是,我改为 [JsonProperty("list")] 。是一样的还是它会回来咬我?
    • 阅读这个 - “JsonProperty 与 DataMember”。 stackoverflow.com/a/20579372/325521 。简短的回答,对于序列化和反序列化 JSON 以及命名属性,请使用 JsonProperty。另外,不要打败自己,对自己如此苛刻。关键是你自己想出来的,所以你永远不会忘记这一点:)
    【解决方案2】:

    如果它以 { 开头,则它是一个对象。 如果它以 [ 开头,则它是一个数组。

    【讨论】:

      猜你喜欢
      • 2010-09-16
      • 1970-01-01
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多