Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 自动将json属性解析为新对象_Javascript_Json_Node.js - Fatal编程技术网

Javascript 自动将json属性解析为新对象

Javascript 自动将json属性解析为新对象,javascript,json,node.js,Javascript,Json,Node.js,我有json格式的传入数据,如下所示: 原始数据: 出于特定的应用目的,我需要将这个复杂的JSON转换为一个简单的key:value格式 因此,我在node js和node json转换包中使用以下代码: var map_data = { list:'data', item : { Battery: 'Battery.value', DO: 'DO.value',

我有
json
格式的传入数据,如下所示:

原始数据:

出于特定的应用目的,我需要将这个复杂的
JSON
转换为一个简单的
key:value
格式

因此,我在node js和node json转换包中使用以下代码:

 var map_data = {
           list:'data',
            item :  { Battery: 'Battery.value',
                        DO: 'DO.value',
                        Humidity: 'Humidity.value',
                        PH: 'PH.value',
                        temperature: 'temperature.value',
                        waterTemperature: 'waterTemperature.value', },
    };
   console.log (map_data)

         var dataTransform = DataTransform(data, map_data);
         var data_result = dataTransform.transform();
并且输出看起来像我想要的:

[ { Battery: '4.08',
    DO: '5.71',
    Humidity: '57.30',
    PH: '14.00',
    temperature: '41.00',
    waterTemperature: '29.69' } ]
但是现在,如果我不知道属性的名称呢? 所以我试着让它自动发现钥匙:

var keys = Object.keys(data.data[0]); 
var keysvalues = '';
    for (i=2; i < keys.length; i++) {
        keysvalues += keys[i]+':"'+ keys[i] + '.value",';
    }
var item = '{'+keysvalues+'}'; 
var map_data = {
            list:"data", 
            item,
    };
 var dataTransform = DataTransform(data, map_data);
 var data_result = dataTransform.transform();

你能帮我把item对象变成一个真实的对象,这样我就可以用我想要的格式自动解析
JSON

原始JavaScript代码 可以更改
如果
约束为处理数组如果您的数据字段不是数组,它将不会处理数组。它工作正常

如果您的json中有数组,那么它将非常复杂(不是关于代码,而是关于您想要的内容)。 另一个问题是
key:value
格式将覆盖许多信息

但是如果您想以任何方式进行,您只需执行以下操作:

  function ToSimpleJson(json , result , prefix)
{
   for(key in json)
   {
       if(typeof json[key]!="object" )
           result[prefix+key] = json[key]
       else if (!json[key].length) // Object
           ToSimpleJson(json[key], result , (key+"."))
       else // Array (But will Override if have more than 1 index)
       {
           json[key].forEach(function (x)
           {    
               ToSimpleJson(x, result , (key + "."))
           })

       }
   }

return result
}
使用空结果和空前缀调用函数

ToSimpleJson(json , {} , "")
结果是:

{
    "data.id" : "Device_6",
    "data.type" : "SensingDevice",
    "Battery.type" : "Number",
    "Battery.value" : "4.08",
    "timestamp.type" : "DateTime",
    "timestamp.value" : "2017-11-09T14:49:02.00Z",
    "unit.type" : "Text",
    "unit.value" : "celsius",
    "DO.type" : "Number",
    "DO.value" : "5.71",
    "Humidity.type" : "Number",
    "Humidity.value" : "57.30",
    "PH.type" : "Number",
    "PH.value" : "14.00",
    "temperature.type" : "Number",
    "temperature.value" : "41.00",
    "waterTemperature.type" : "Number",
    "waterTemperature.value" : "29.69",
    "subscriptionId" : "59d5eeec4f3db340052d618c"
}

因此,基本上您希望在给定所有嵌套对象的“value”属性的情况下创建一个映射。这意味着您必须过滤掉不是对象或没有“值”属性的原始对象的关键点。 我会这样做(我使用ES6来避免冗长)

要使用它,只需调用
constres=getMap(rawData,'value')

下面提供了一个更优雅的
getSingleMap
实现

getSingleMap = (datum, prop) => {
  const mapKeys = Object.keys(datum).filter(key => isObject(datum[key]) && datum[key][prop]);
  return mapKeys.reduce((acc, key) => {
    acc[key] = datum[key][prop];
    return acc;
  }, {});
}

更新:我也用它创建了一个npm包,名为json2kv,你可以找到它的源代码

如果你从中得到字符串中的json,那么调用
var myJsonObject=json.parse(你的json字符串)
。现在,
myJsonObject
的行为就像一个具有所有属性的普通js对象。您还可以调用
JSON.stringify(myJsonObject)
来序列化对象。有时候,像jqueryajax调用一样,方法返回已经解析的json。所以你只需要像平常一样使用js对象。阅读一个方法的文档以了解其行为。我已经尝试解析为JSON,但无法使其工作。我总是有一个“意外的令牌”错误…我刚才也尝试了stringify调用,但它也不起作用。显示您的json字符串以及如何调用
json.parse()
,出现错误的地方问题是我只需要attribute.value字段。我有不需要的attribute.type、attribute.metadata。因此,我需要一种在不知道属性名称的情况下获取所有attribute.value字段的方法。我编辑了这个问题,以便您可以更好地查看原始的json数据格式Use
for(json中的var k)
和k将是属性名,并指向
for
中的任何内容。谢谢,如果我想将json的所有值提取为key:value格式,这也很好。它也有用!您还可以在
else
中向前缀添加数组索引,以避免重写!这正是我想要的,提取attribute.value字段(如果存在)。我测试了你的代码,它工作得很好!很酷,很高兴能帮上忙:)请查看最新的编辑,以获得更好、更优雅的解决方案!谢谢,我能再问你一个问题吗?我刚刚发现我有一种情况可能更复杂。如果我有属性“location”,那么我想要的值不是location.value,而是location.value.coordinates。如何传递此异常(如果data.data[0].location存在?)好的,抱歉,我找到了一种方法!
{
    "data.id" : "Device_6",
    "data.type" : "SensingDevice",
    "Battery.type" : "Number",
    "Battery.value" : "4.08",
    "timestamp.type" : "DateTime",
    "timestamp.value" : "2017-11-09T14:49:02.00Z",
    "unit.type" : "Text",
    "unit.value" : "celsius",
    "DO.type" : "Number",
    "DO.value" : "5.71",
    "Humidity.type" : "Number",
    "Humidity.value" : "57.30",
    "PH.type" : "Number",
    "PH.value" : "14.00",
    "temperature.type" : "Number",
    "temperature.value" : "41.00",
    "waterTemperature.type" : "Number",
    "waterTemperature.value" : "29.69",
    "subscriptionId" : "59d5eeec4f3db340052d618c"
}
const isObject = (o) =>
  o instanceof Object && o.constructor === Object;

const getSingleMap = (datum, prop) => {
  const mapKeys = Object.keys(datum).filter(key => isObject(datum[key]) && datum[key][prop]);
  const obj = {};
  mapKeys.forEach(key => {
    obj[key] = datum[key][prop];
  });

  return obj;
}

const getMap = (rawData, prop) =>
  rawData.data.map(datum => getSingleMap(datum, prop));
/*
res == [
  {
    "Battery": "4.08",
    "DO": "5.71",
    "Humidity": "57.30",
    "PH": "14.00",
    "temperature": "41.00",
    "waterTemperature": "29.69"
  }
];
*/
getSingleMap = (datum, prop) => {
  const mapKeys = Object.keys(datum).filter(key => isObject(datum[key]) && datum[key][prop]);
  return mapKeys.reduce((acc, key) => {
    acc[key] = datum[key][prop];
    return acc;
  }, {});
}