Javascript - Поиск значения Json по ключу - PullRequest
0 голосов
/ 17 апреля 2019

По независящим от меня причинам мне нужно искать одно и то же значение ключа в 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"}}

Я пытался отобразить его, чтобы проверить, является ли свойство неопределенным или нет, ничего не работает.

Ответы [ 3 ]

1 голос
/ 17 апреля 2019

Я написал небольшой кусочек рекурсивного кода. Работает на эти входы:

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 голос
/ 17 апреля 2019

Вы можете искать по объекту или массиву по ключу. Если ключ, который вы ищете, найден, верните его. В противном случае рекурсивно пропустите все найденные объекты на обратном пути:

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() и вернет первое найденное совпадение при первом поиске по глубине.

0 голосов
/ 17 апреля 2019

Вы можете пропустить 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...