Есть ли способ разобрать / или получить конкретные поля из не JSON Object? - PullRequest
0 голосов
/ 16 октября 2019

Я создаю приложение, которое мне нужно, чтобы получить некоторые значения от конкретного оборудования. Я могу получить доступ к этим данным через API. Когда я получаю доступ к определенному адресу HTTPS, я получаю данные (В этом случае моя локальная сеть, http://192.168.1.148/ay).

Обновление - Вывод с адреса:

{t}{s}Voltage{m}128 V{e}{s}Current{m}0.035 A{e}{s}Power{m}2 W{e}{s}Apparent Power{m}5 VA{e}{s}Reactive Power{m}4 VAr{e}{s}Power Factor{m}0.50{e}{s}Energy Today{m}0.307 kWh{e}{s}Energy Yesterday{m}0.136 kWh{e}{s}Energy Total{m}2.985 kWh{e}{t}ON

Когда я получаю доступ к этомуадрес, я получаю это: https://i.imgur.com/dBbOdON.png

Если я обновлю страницу, я могу получить более новую информацию.

Это не файл JSON, поэтому я не могу использовать JSON Parse. Я хотел быу меня есть две переменные со значением двух полей этого, и когда значение меняется, я бы хотел, чтобы моя переменная изменилась, поэтому я думаю, что мне нужно что-то асинхронное.

В частности, я хотел бы иметь эти значения- «Общее количество энергии», которое в данном случае составляет 2,557 кВт или 2571 Вт. Таким образом, это может быть число с плавающей запятой (кВт), целое число (Wh) или даже строка, это не имеет значения - Состояние, которое может быть включено или выключено. В этом вызовея показал на изображении, что он включен --- {e} {t} ON

Я ожидаю иметь переменные с примером обновления, например:

energyTotal = "3.00"; status = "ON";

Если статус изменится на выкл, я хочу, чтобы моя переменная изменилась

status =" OFF "

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Вот функция для декодирования информации в объект:

function parseInput(strInput) {
    let obj = {};

    // split the string on {t} this should give us three parts
    // 1) empty string 2) key/value pairs string 3) status string
    let splitT = strInput.split("{t}");
     // loop through each string
    for (let ndxT = 0; ndxT < splitT.length; ndxT++) {
        let strT = splitT[ndxT];
        // if it is an empty string, go to the next iteration
        if (strT.trim().length === 0) continue;
        // if it is starts with {s}, it is the key/value pairs
        // we'll process that accordingly
        if (strT.startsWith("{s}")) {
            // split the string around {e}
            let splitE = strT.split("{e}");
            // loop through each string
            for (let ndxE = 0; ndxE < splitE.length; ndxE++) {
                let strE = splitE[ndxE];
                // the last {e} has an empty string after it, just skip it
                if (strE.trim().length === 0) continue;
                // get rid of the {s} at the start of the string
                if (strE.startsWith("{s}")) strE = strE.slice(3);
                // now we can split on {m} and get our key and value
                let splitM = strE.split("{m}");
                let strKey = splitM[0];
                let value = splitM[1];
                let key;
                // we need to convert our key into something
                // we can code with
                if (strKey === "Voltage") key = "voltage";
                if (strKey === "Current") key = "current";
                if (strKey === "Power") key = "power";
                if (strKey === "Apparent Power") key = "apparentPower";
                if (strKey === "Reactive Power") key = "reactivePower";
                if (strKey === "Power Factor") key = "powerFactor";
                if (strKey === "Energy Today") key = "energyToday";
                if (strKey === "Energy Yesterday") key = "energyYesterday";
                if (strKey === "Energy Total") key = "energyTotal";
                obj[key] = value;
            }
        } else {
            // we must be at the status part
            obj.status = strT;
        }
    }
    return obj;
}

Вот как вы бы ее использовали.

let obj = parseInput(myInputString);
console.log(obj.energyTotal);
0 голосов
/ 16 октября 2019

Regex отлично подходит для этого. Проверьте эти два сайта, чтобы узнать, как его использовать:

...