Javascript - 按键搜索Json值

问题描述 投票:0回答:3

由于我无法控制的原因,我需要在具有不同结构的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"}}

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

javascript json object
3个回答
1
投票

您可以按键搜索对象或数组。如果找到了您要找的钥匙,请将其退回。否则通过递归传递沿途发现的任何对象:

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()一样,并返回通过深度优先搜索找到的第一个匹配。


1
投票

我写了一小段递归代码。它适用于这些输入:

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"]

-1
投票

你可以跳过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));
© www.soinside.com 2019 - 2024. All rights reserved.