让我在JSON中有如下这样的结构数组:
public static void main(String[] args) throws ParseException {
String date = "10-10-2018";
SimpleDateFormat givenFormat = new SimpleDateFormat("dd-MM-yyyy");
SimpleDateFormat newFormat = new SimpleDateFormat("dd-MMM-yyyy");
Date givenDate=givenFormat.parse(date);
System.out.println(givenDate);
String newDate=newFormat.format(givenDate);
System.out.println(newDate);
}
它是人类可读的,但是它的问题是对该数组中的所有实体重复[{
"name": "Amrit",
"second_name": "Valentine"
},
{
"name": "Beatriz",
"second_name": "Carty"
}// And so on...
]
和"name"
。如果阵列很大,则会产生大约40%的大小开销。
另一方面,我可以翻译此数据结构:
"second_name"
但是它不再是人类可读的,但是大小是最佳的。这也容易出错,因为不能保证{
"names": ["Amrit", "Beatriz" /* ... */],
"second_names": ["Valentine", "Carty" /* ... */]
}
和"names"
的大小相同。
在JSON中是否需要权衡取舍,因此我可以使用结构数组而无需重复文件名,并且大小仍然是最佳的?
答案 0 :(得分:3)
不是JSON本身的一部分,不是。我在项目上所做的是一个通用系统,其中JSON如下所示:
{
"__keys__": ["name", "second_name"],
"values": [
["Amrit", "Valentine"],
["Beatriz", "Carty"]
]
}
...一旦解析了JSON,我就向它抛出一个实用程序函数以使用它并将其转换为对象数组。遵循以下原则:
const json = `{
"__keys__": ["name", "second_name"],
"values": [
["Amrit", "Valentine"],
["Beatriz", "Carty"]
]
}`;
const parsed = JSON.parse(json);
const expanded = expand(parsed);
console.log(expanded);
function expand(data) {
const keys = data.__keys__;
return data.values.map(entry => {
const obj = {};
keys.forEach((key, index) => {
obj[key] = entry[index];
});
return obj;
});
}
或者,当然,您只需要退出__keys__
并假设端点知道密钥应该是什么,但是与上述相比,它更不利于可读性/调试。 :-)
(您可以将forEach
拖入reduce
中,因为您可以将任何数组操作都拖入reduce
中,但它不会为您带来任何好处。 )