我构建手机应用程序,我经常在API中使用JSON。问题是有时我不知道如何格式化JSON数据。
例如,iOS UITableView将NSArray作为数据源。
{
"contact_id": [
"455",
"464"
],
"contact_name": [
"Administrator",
"Main contact"
]
}对我来说,这是有意义的,因为我不需要遍历任何东西,但我被告知,依赖与头寸匹配的指数是不安全的。
我记得,当我问问题的时候,人们提醒我注意不要把记录分离成不同的数组,相反,我应该返回对象数组:
[
{
"contact_id": "455",
"contact_name": "Administrator"
},
{
"contact_id": "464",
"contact_name": "Main contact"
}
]我想知道格式化JSON的最佳实践。
发布于 2014-02-28 16:02:01
在第一个示例中,您完全依赖于contact_id和contact_name的索引匹配。
因此,假设您要提取单个索引的contact_id和contact_name,以获得这样的用户:
var User = { "Id": contact_id[0], "Name": contact_name[0] };
Log.print(User);
>> 455 Administrator这可能现在还不错,但是想象一下,当一个元素被引入错误的索引时会发生什么呢?假设出现了一个新开发人员,并决定插入一个新用户,但是S/他并不太注意他正在介绍的地方,或者他误解了JSON应该如何格式化--结果是一个类似于JSON的
{
"contact_id": [
"455",
"456",
"464"
],
"contact_name": [
"Administrator",
"Main contact",
"Sub Contact"
]
}在这里,新开发人员认为,contact_id可能只是顺其自然地被命令,而contact_name也应该按其角色(因为,S/他又一次将contact_name误解为一个角色列表,即使数组名为contact_name)。
因此,他在索引1处引入了新用户的id,在索引2处引入了新用户的名称,然后突然就让您调试为什么所有用户名、id等都是错误的。
因为你永远不应该相信,无论是你自己在未来,或其他人将坚持您的任意规则,任何给定的索引对您的数组是相关联的。
这也是为什么您不应该匹配的原因,例如,对索引的角色权限。假设你有一个有序的角色列表
var roles = [
"Admin",
"LocalAdmin",
"ContentManager",
"User"
];在您的权限脚本中,您检查user.role == roles[0],有时在将来--他不知道您编写的权限检查是这样工作的--决定添加一个新的用户"SuperAdmin",创建以下JSON
var roles = [
"SuperAdmin",
"Admin",
"LocalAdmin",
"ContentManager",
"User"
];根据user.role == roles[0]索引匹配的逻辑,每个管理员现在都变成了SuperAdmin,尽管他们不应该这样做。
发布于 2014-02-28 04:18:43
将相关数据保存在一起。
简单地说,就是将相关数据保存在一起,因为通常将其分开要比将其合并起来容易。
发布于 2014-02-28 18:24:36
第二种方法是最好的办法。
这是因为如果你想一想,你的应用程序需要的数据是“联系人列表”。如果我的面向对象( OOP )概念不是生疏的,接触就相当于一个对象。那就像new Contact()一样。一个列表相当于一个数组。因此,您需要这些联系人对象的数组。在C#中,它等同于new List<Contact>() --一个联系人列表。
另外,由于您已经知道数据是一个联系人列表,所以contact_是不必要的。
[
{
"id": "455",
"name": "Administrator"
},
{
"id": "464",
"name": "Main contact"
}
]第一种方法的另一个问题是,当您循环遍历数据时,您将使用谁的长度作为基础?例如,您选择了contact_id作为基础:
var data = {...}
for(var i = 0; i < data.contact_id.length;i++){...}现在,如果您决定将contact_id更改为id呢?您必须清除代码并将data.contact_id.length替换为data.id.length。或者,如果contact_id被完全取出怎么办?你会打破圈套的。然而,首先您有一个数组:
var data = [];
for(var i = 0; i < data.length;i++){...}即使取出或重命名对象属性,也不会中断要使用的循环。您的循环只关心数组。对象将由循环中的代码处理,而不是循环本身。节省您5分钟的调试。
https://codereview.stackexchange.com/questions/43004
复制相似问题