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数据格式Usefor(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;
}, {});
}