当在JSON中使用包含对象的对象与对象数组时,可接受的约定是什么

What is the accepted convention for when to use an object containing objects vs an array of objects in JSON?

本文关键字:对象 可接受 约定 是什么 数组 包含 JSON 当在      更新时间:2024-01-14

我目前正在编写一个GUI,它从根本上允许用户使用AJAX编辑/填充/删除许多设置文件,其中的设置存储在JSON中。

我对JavaScript的经验有限(坦率地说,我对MATLAB之外的任何东西都没有什么经验),但我发现自己正在重组我的设置结构,因为使用包含更多对象而不是对象数组的对象的语义。在C#中,我会使用KeyValuePair来实现这一点,但是JSON结构阻止了我在这里做我真正想做的事情,我想知道是否有一个公认的在JavaScript中实现这一目标的约定,我现在应该采用它,而不是进行这些更改,发现我造成的问题比我解决的问题多。

样本数据结构的要求与我的许多结构类似,它接受任何年份,在这些年份中接受任何数量的事件,在这些事件中接受一组值。

这是以前的结构:

{"2013":
    {
    "someEventName":
        {
        "data1":"foo",
        "data2":"bar",
        ...},
    ...},
...}

这是我的理想结构,其中年份/事件名称作为数组类型的值的字符串类型的键:

["2013":
    [
    "someEventName":
        {
        "data1":"foo",
        "data2":"bar",
        ...},
    ...],
...]

据我所知,这将是无效的JSON表示法,因此这里是我提出的结构:

[{"Key":"2013",
  "Value":
      [{"Key":"someEventName",
        "Value":
            {
            "data1":"foo",
            "data2":"bar",
            ...}
      },
      ...]
},
...]

我提出的关于某个东西应该是包含对象的对象还是对象数组的"测试"是"我的子结构是否接受固定的、已知数量的对象?"如果是,设计为包含对象的物体;如果没有,则设计为对象数组。

我被要求经常过滤这个结构来查找数据/值,我从来没有想过要利用使用数组带来的索引功能,然而,从数组中推送和删除数据比对对象更灵活,而且使用包含对象的对象会偏离OOP的类模型;另一方面,如果它是一个包含对象的对象,那么通过"Key"查找数据的方法似乎都更简单,而且我不认为自己在这些对象上使用Prototype方法,所以谁在乎打破OOP呢。

响应1例如,在以前的结构中添加一年,代码将是OBJ["2014"]={};在新的结构中它将是CCD_ 2;这两种解决方案同样缺乏复杂性。

在这两种情况下,删除都同样微不足道。

然而,如果我想操作一个事件的值,比如说,使用一个函数,如果我将指向该对象的指针传递给该函数,并试图在引用中超采样整个对象,它将不起作用:我被迫复制原始事件(使用jQuery或更糟的方法),并将其重新插入父级。使用"Value"属性,只要我将整个{"Key":"", "Value":""}对象传递给函数,我就可以随心所欲地覆盖整个Value元素。在这种情况下,对我来说,使用对象数组方法要干净得多。

我对数组的更改也是基于栈溢出上的大量其他响应,这些响应鼓励使用它们而不是对象。

如果您要做的只是迭代对象,那么对象数组更有意义。如果这些是设置,人们需要查找特定的设置,那么原始对象表示法会更好。原件允许人们编写类似的代码

var foo = settings['2013'][someEventName].data1

而从对象数组中获取数据需要对它们进行迭代,以找到关键字为2013的对象,这取决于列表的长度,会导致性能问题。

将新数据推送到对象就像一样简单

settings['2014'] = {...}

从对象中删除数据也是简单的

delete settings['2014']