3

我没有实现太多 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"  : [...]
                       }
            };

好处:

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

问题:

  • 如果预期会发生变化,静态模型/结构可能会出现更多问题
  • 提取数据时代码可能更混乱
4

2 回答 2

2

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

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

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

于 2013-01-21T06:17:31.370 回答
1

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

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

  • 它更严格(例如添加另一个电话属性并不容易)
  • 稀疏数据不方便,因为您最终会得到很多“未定义”

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

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

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

{"Name": "Editor",
"FieldType": "User",
"RealFieldName": "Editor",
"DisplayName": "Modified By",
...
"AllowGridEditing": "FALSE"}
于 2013-01-21T06:32:09.610 回答