Javascript-按键搜索Json值

Javascript-按键搜索Json值,javascript,json,object,Javascript,Json,Object,出于我无法控制的原因,我需要在具有不同结构的JSON中搜索相同的键值 我需要一个能够找到“valor”值的代码,无论JSON的结构是什么,其中总会有一个供应商密钥 现在,我收到了两个JSON示例: [2,"4:4","ExtraNotification",{"typeModel":"553","serialNumber":"0218-009","vendor":"ABC","version":"4.0.2.14"}] 及 我尝试映射它,检查属性是否未定义,但没有任何效果。您可以按键搜索对象或数

出于我无法控制的原因,我需要在具有不同结构的JSON中搜索相同的键值

我需要一个能够找到“valor”值的代码,无论JSON的结构是什么,其中总会有一个供应商密钥

现在,我收到了两个JSON示例:

[2,"4:4","ExtraNotification",{"typeModel":"553","serialNumber":"0218-009","vendor":"ABC","version":"4.0.2.14"}]


我尝试映射它,检查属性是否未定义,但没有任何效果。

您可以按键搜索对象或数组。如果找到了您要查找的密钥,请将其返回。否则,将沿途找到的任何对象递归地传递回:

let j=[2,“4:4”,“ExtraNotification”,{“typeModel”:“553”,“serialNumber”:“0218-009”,“vendor”:“ABC”,“version”:“4.0.2.14”}]
让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”}
功能findKey(obj,键){
对象项(obj)的([k,v]){
如果(k==键)返回v
if(typeof v=='object'&&v!==null){
let found=findKey(v,键)
如果(找到)返回找到
}
}
}
log(findKey(j,“供应商”))

log(findKey(j2,'vendor'))
我编写了一小段递归代码。它适用于这些输入:

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"]
var输入=[2,4:4”,“extrannotification”,{“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=[];
功能搜索(obj){
if(阵列的obj实例){
对于(变量i=0;i
您可以跳过
解析
(或
字符串化
返回)并在字符串中搜索。什么坏事都不应该发生

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”}];
常量正则表达式=/“供应商”:“([a-zA-Z0-9]*)”/;
log(regex.exec(json1));

log(regex.exec(json2))第一个是数组,您需要循环结果并测试每个项目,以查看它是否是具有键“vendor”的对象第二个是对象数组(“collection”),您可以在此处使用map。您可以使用,这样您可以在不同的位置搜索structs@RafaelLima我试过这个方法,但是它就是不起作用。请阅读
json
标签的用法说明。哦,我认识他。:)他来了:
“vendor”:{“\u name”:“Mr.Murphy!!”}
我假设查找的vendor键是一个简单的值,而不是一个对象。您假设的远不止这些。您还假设供应商值仅由字母字符组成(没有标点符号、空格、重音字母、希腊语、引号等),所有这些都是正确的。我相信这基本上是对的,被识别为“供应商密钥”的东西不会像
“commça va,Comme ci,Comme ci,Comme ci,Commeça”
。虽然
-
-
不是不可能的。尽管如此,修改regexp以允许更多字符仍将使解决方案比递归遍历任意结构更简单。
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"]