JSON中的结构数组与数组结构

时间:2018-11-02 10:34:20

标签: json

让我在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中是否需要权衡取舍,因此我可以使用结构数组而无需重复文件名,并且大小仍然是最佳的?

1 个答案:

答案 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中,但它不会为您带来任何好处。 )