JSON数据,属性有时是数组,有时是对象

时间:2019-08-24 07:00:09

标签: json

我正在读取第三方的JSON响应,并且发现只有一个对象要返回并且该属性有多个对象时,某些属性才会以单个对象的符号形式返回该值作为对象数组返回。

响应中单个对象的示例

{
  "data": {
    "property1":"value",
    "property2":"value",
    "property3":"value"
  }
}

响应中的对象数组示例

{
  "data": [
  {
    "property1":"value",
    "property2":"value",
    "property3":"value"
  },
  {
    "property1":"value",
    "property2":"value",
    "property3":"value"
  },
  {
    "property1":"value",
    "property2":"value",
    "property3":"value"
  },
  {
    "property1":"value",
    "property2":"value",
    "property3":"value"
  }
 ]
}

为什么从同一端点接受两种不同的响应格式?

1 个答案:

答案 0 :(得分:1)

每当我看到它发生时,这个问题也困扰着我。我从来没有真正喜欢过必须检查该值才能知道如何访问它。

有人可能会说这样做可以节省有效负载中的一些空间。当只有一个值时,可以节省两个字节,省去[]。但是恕我直言,它的功能薄弱,众所周知,处理数据更加困难。

但是以另一种方式看待它,这似乎是有道理的:它针对最常见的结果(单个值)进行了优化。在结构非常严格的情况下,我看到了相当一部分数据格式。例如,类似递归字典的结构,其中任何包含对象的属性必须都是该对象的数组。因此,在深度嵌套的对象中,访问值可能看起来像这样:

root.data[0].aparent[0].thechild[0].myvalue

vs:

root.data.aparent.thechild.myvalue

如果实际上有多个值,则使用数组是合适的。

我不一定要买这个,因为您仍然必须进行检查,您必须在使用数据之前进行一些测试(例如,如果没有返回响应)。在具有某种形式的模式匹配的语言中,这种类型的响应可能更有意义。