JSON:最好使用一个对象(键/值对),还是两个对象将数据与模型分开?

时间:2013-01-21 06:02:50

标签: javascript json data-structures data-modeling

我没有实现太多JSON,所以我很好奇是否有建议的处理数据的方法。我猜测有两种主要方法(也许它们是无效的JSON),但我想看看是否有任何额外的优缺点或更好的方法?


方法1 :键/值对的组合

var all_in_one = { "person"  : [{
                                  "firstName" : "John",
                                  "lastName"  : "Smith",
                                  "phone"     : [{ 
                                                   "areaCode"  : "800", 
                                                   "number"    : "222-3333" 
                                                 },
                                                 {
                                                   "areaCode"  : "800",
                                                   "number"    : "222-3334",
                                                   "extension" : "1111"
                                                 }]
                                },
                                {
                                  "firstName" : "John",
                                  "lastName"  : "Rolfe"
                                },
                                {...}],
                   "other"    : [{...}]
                 };

好处:

  • 键接近于值(循环和拉取值时更直观,更清晰的代码)
  • 不需要值/键(流体模型/结构)

问题:

  • 多个记录的更多开销(重复密钥)

方法2 :从值中分离键

var json = { "model" : { "person" : ["firstName","lastName",["areaCode","number","extension"]],
                         "other"  : [...]
                       },
             "data"  : { "person" : [["John","Smith",[["800","222-3333",undefined],
                                                      ["800","222-3334","1111"]]],
                                     ["John","Rolfe",[[undefined,undefined,undefined]],
                                     [...]
                                    ],
                         "other"  : [...]
                       }
            };

好处:

  • 减少开销(一次定义键)
  • 可在一个地方更改的静态模型/结构

问题:

  • 如果需要更改
  • ,静态模型/结构可能会出现问题
  • 提取数据时代码可能更容易混淆

2 个答案:

答案 0 :(得分:2)

我从未见过有人使用方法2.它没有将“数据与模型”分开;无论如何,这是没有意义的,因为数据 模型。你所做的就是很难说出任何数据

我想现在你可以在一个地方重命名一个字段,但这必须是最不常见的模式更改类型之一。添加字段,移动字段,删除字段,交换两个字段,使字段可选等等都将是无法验证的噩梦。

(至于开销,gzip将在线上处理它,并且你的JSON解码器和/或语言有望足够聪明,可以为每个重复的键重用相同的字符串对象。)

答案 1 :(得分:1)

我从未以对象的形式看过你的方法2,但它看起来非常类似于数据表,其中第一个数组包含列名,其他数据包含数据。

我看到第二种方法存在两个主要问题:

  • 它更加严格(例如,添加其他手机属性并不容易)
  • 使用稀疏数据不方便,因为你最终得到了很多“未定义的”

明显的好处是数据大小要小得多,因为属性名称不需要重复。

底线:如果数据很好地适合表格(只有几个空单元格)并且数据集很大,我会使用第二种方法。

[编辑]关于你的问题“我很好奇我是否应该传递其他元数据”,这绝对是第二种方法的额外好处。正如我在评论中已经提到的,Google Visualization就是一个很好的例子。我也使用Microsoft SharePoint 2013,它正是这样做的。以下是SharePoint的示例:

{"Name": "Editor",
"FieldType": "User",
"RealFieldName": "Editor",
"DisplayName": "Modified By",
...
"AllowGridEditing": "FALSE"}