应该如何解释这个JSON结构?

时间:2014-11-13 21:59:49

标签: c# arrays json parsing json.net

我刚刚开始使用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; } }

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

我理解它与根目录中的列表有关。但是什么?!或者至少 - 我应该谷歌什么?!

  

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

它不能是this one,因为外括号是卷曲的而不是方形的......

this solution中,我们最终得到一个对象,而不是一个数组,因此它不是我的目标。

2 个答案:

答案 0 :(得分:4)

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

"paging"是一个对象。

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

使用dotNetFiddle:https://dotnetfiddle.net/4qLTvq

请参阅上面小提琴控制台窗格中的输出。

这里&#39; s如何声明您的类以将此特定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类。您可以选择您认为合适的任何其他名称。

关于Object vs Array

的说明

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

object

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

array

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

答案 1 :(得分:1)

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

开头