更改JSON数组以获取更小的消息?

时间:2013-11-21 19:04:21

标签: json

当使用JSON从同一个类发送对象数组时,对象字段会重复多次,通常是不必要的,并且对于长度较大的数组,消息会变得很长。据我所知,没有办法只使用JSON删除字段的重复。所以我正在寻找一种解决方案来解决数组的编码和解码,而无需重复字段名称。

例如,下面的数组:

[
  {id:1;name:Name 1;description:Description 1}, 
  {id:2;name:Name 2;description:Description 2}, 
  ..., 
  {id:N;name:Name N;description:Description N}
]

可以表示为:

B:

{
  fields:[id, name, description],
  values:[
       [1,Name 1,Description 1], 
       [2,Name 2,Description 2], 
       ..., 
       [N,Name N,Description N]
     ]
}

在长度较大的数组中花费的空间更少。

但是我需要一个自动完成这种转换的解决方案(从A到B,从B到A)。它可以使用B represantation或更好的方法,通过消除字段名称来减少邮件大小。

任何解决方案?

1 个答案:

答案 0 :(得分:1)

您可以通过编写两个简单的javascript函数根据需要进行编码和解码来实现此目的。为了使此模式起作用,必须应用一些规则:

  • 必须有一个有效的JSON输入数据字符串,尽管您可以使用 带有对象的纯数组
  • 所有数组元素必须具有相同的对象结构格式
  • 它不会与子对象一起出现

缩小/取消缩小对象功能:

function minifyObject(obj) {
  var fields = Object.keys(obj[0]);
  var values = [];

  for(var record in obj) {
    var value = [];
    for(var field in fields) {
      value.push(obj[record][fields[field]]);
    }
    values.push(value);
  }

  return {
    fields: fields,
    values: values
  }
}

function unminifyObject(obj) {
  var output = [];

  for(var i = 0; i < obj.values.length; i++) {
    var record = {};
    for(var j = 0; j < obj.fields.length; j++) {
      record[obj.fields[j]] = obj.values[i][j];
    }
    output.push(record);
  }

  return output;
}

var data = [
  {"id":1, "name": "Name 1", "description": "Description 1"}, 
  {"id":2, "name": "Name 2", "description": "Description 2"}, 
  {"id":3, "name": "Name 3", "description": "Description 3"}
];

var minified = minifyObject(data);

console.log("Minified object\n", minified);

var unminified = unminifyObject(minified);

console.log("Unminified array\n", unminified);

也可以使用ES6简化此代码。

您还可以在这里找到我的测试JSON转换器:https://zikro.gr/dbg/so/20129724/