由于我无法控制的原因,我需要在具有不同结构的JSON中搜索相同的键值。
我是一个能够找到“valor”值的代码,无论JSON的结构如何,总有一个供应商密钥在其中。
到目前为止,我收到了两个JSON示例:
[2,"4:4","ExtraNotification",{"typeModel":"553","serialNumber":"0218-009","vendor":"ABC","version":"4.0.2.14"}]
和
{"id":"101010c90310","timestamp":"2019-02-18T18:33:35.819925957Z","station":true,"type":"call","action":"ExtraNotification","payload":{"model":"F254A","serialNumber":"1543906","vendor":"EVZ","version":"0.180601","si":"2048188","icid":"89312490184"}}
我试图映射它,检查属性是否未定义,没有任何效果。
您可以按键搜索对象或数组。如果找到了您要找的钥匙,请将其退回。否则通过递归传递沿途发现的任何对象:
let j = [2,"4:4","ExtraNotification",{"typeModel":"553","serialNumber":"0218-009","vendor":"ABC","version":"4.0.2.14"}]
let j2 = {"id":"101010c90310","timestamp":"2019-02-18T18:33:35.819925957Z","station":true,"type":"call","action":"ExtraNotification","payload":{"model":"F254A","serialNumber":"1543906","vendor":"EVZ","version":"0.180601","si":"2048188","icid":"89312490184"}}
function findKey(obj, key) {
for ([k, v] of Object.entries(obj)){
if (k == key) return v
if (typeof v === 'object' && v !== null ){
let found = findKey(v, key)
if (found) return found
}
}
}
console.log(findKey(j, 'vendor'))
console.log(findKey(j2, 'vendor'))
这将像find()
一样,并返回通过深度优先搜索找到的第一个匹配。
我写了一小段递归代码。它适用于这些输入:
var input = [2,"4:4","ExtraNotification",{"typeModel":"553","serialNumber":"0218-009","vendor":"ABC","version":"4.0.2.14"}, [{ "vendor": "111"}, { "vendor": "222"} ]];
//var input = {"id":"101010c90310", "test": { "test1": { "vendor": "aaa" } }, "timestamp":"2019-02-18T18:33:35.819925957Z","station":true,"type":"call","action":"ExtraNotification","payload":{"model":"F254A","serialNumber":"1543906","vendor":"EVZ","version":"0.180601","si":"2048188","icid":"89312490184"}};
var founds = [];
function search(obj) {
if (obj instanceof Array) {
for(var i = 0; i < obj.length; i++) {
search(obj[i]);
}
} else {
for(var key in obj) {
if (key == "vendor") {
founds.push(obj[key]);
} else if (typeof obj[key] == "object") {
search(obj[key]);
}
}
}
};
search(input);
console.log(founds);
// First input: ["ABC", "111", "222"]
// Second input: ["aaa", "EVZ"]
你可以跳过parse
(或stringify
它回来)并在字符串中搜索。什么都不应该发生......
const json1 = '{"id":"101010c90310","timestamp":"2019-02-18T18:33:35.819925957Z","station":true,"type":"call","action":"ExtraNotification","payload":{"model":"F254A","serialNumber":"1543906","vendor":"EVZ","version":"0.180601","si":"2048188","icid":"89312490184"}}';
const json2 = '[2,"4:4","ExtraNotification",{"typeModel":"553","serialNumber":"0218-009","vendor":"ABC","version":"4.0.2.14"}]';
const regex = /"vendor":"([a-zA-Z0-9]*)"/;
console.log(regex.exec(json1));
console.log(regex.exec(json2));