es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Análisis de objeto JSON Tasmota en NodeRed

Estoy jugando con NodeRed. Esp32 con Tasmota enviando mensajes mqtt como el siguiente ejemplo:

{
  "Time": "2021-12-05T20:46:40",
  "MJ_HT_V1391ef1": {
    "mac": "582d34684ef1",
    "Temperature": 22.6,
    "Humidity": 50.9,
    "DewPoint": 11.9,
    "Battery": 100,
    "RSSI": -92
  },
  "MJ_HT_V1385877": {
    "mac": "582d31385557",
    "Temperature": 22,
    "Humidity": 53.3,
    "DewPoint": 12,
    "Battery": 85,
    "RSSI": -86
  }
}

Por favor, ¿cómo puedo obtener los nombres MJHTV1391ef1 y MJHTV1385877 sin conocerlos y también si el JSON puede tener más objetos similares además de solo dos? Además, necesitaré acceder a la información como MJHTV1391ef1.mac o MJHTV1391ef1.Temperature.

Si utilizo algo como

var zprava = msg.payload;
msg.payload = zprava["MJ_HT_V1391ef1"]["Temperature"];

Funciona y obtengo el valor 22.6. Pero necesito hacerlo de manera más dinámica. ¿Alguna forma de hacer un bucle que recorra el JSON?

He pasado casi 5 días buscando una solución. Por favor, ayúdame.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para recuperar dinámicamente los nombres de los objetos en el JSON, puedes utilizar el método Object.keys() en JavaScript. Este método devuelve un arreglo que contiene los nombres de las propiedades de un objeto.

    Para acceder a la información como MJ_HT_V1391ef1.mac o MJ_HT_V1391ef1.Temperature de manera dinámica, puedes recorrer las claves del objeto y acceder a las propiedades utilizando la notación de corchetes.

    Aquí tienes un ejemplo de flujo Node-RED que recupera dinámicamente los nombres y valores de las propiedades del JSON:

    [{"id":"26b82e6c.f2ed5c","type":"inject","z":"d82c1a32.10f03","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"{\"Time\":\"2021-12-05T20:46:40\",\"MJ_HT_V1391ef1\":{\"mac\":\"582d34684ef1\",\"Temperature\":22.6,\"Humidity\":50.9,\"DewPoint\":11.9,\"Battery\":100,\"RSSI\":-92},\"MJ_HT_V1385877\":{\"mac\":\"582d31385557\",\"Temperature\":22,\"Humidity\":53.3,\"DewPoint\":12,\"Battery\":85,\"RSSI\":-86}}","payloadType":"json","x":220,"y":200,"wires":[["a742dd8d.6c22"]]},{"id":"a742dd8d.6c22","type":"function","z":"d82c1a32.10f03","name":"Análisis dinámico","func":"var payload = msg.payload;\n\n// Recorrer las claves del objeto\nfor (var device in payload) {\n    // Verificar si no es la clave Time\n    if (payload.hasOwnProperty(device) && device !== 'Time') {\n        // Obtener el objeto del dispositivo\n        var deviceObj = payload[device];\n        \n        // Recorrer las propiedades del objeto del dispositivo\n        for (var property in deviceObj) {\n            if (deviceObj.hasOwnProperty(property)) {\n                // Obtener el valor de la propiedad\n                var value = deviceObj[property];\n                \n                // Construir el nombre de la propiedad\n                var propertyName = device + '.' + property;\n                \n                // Asignar el valor de la propiedad al mensaje\n                msg[propertyName] = value;\n            }\n        }\n    }\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":460,"y":200,"wires":[["d5f0159a.abdf38"]]},{"id":"d5f0159a.abdf38","type":"debug","z":"d82c1a32.10f03","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":630,"y":200,"wires":[]}]
    

    Este flujo toma una cadena JSON como el ejemplo que proporcionaste y la convierte en un objeto JSON. El nodo de función luego recorre las claves del objeto, construye los nombres de las propiedades (por ejemplo, MJ_HT_V1391ef1.Temperature) y asigna los valores de las propiedades al mensaje utilizando la notación de corchetes.

    Puedes utilizar el nodo de depuración para verificar si los nombres y valores de las propiedades se asignan correctamente al mensaje.

    Ten en cuenta que este flujo asume que el JSON siempre contiene objetos con propiedades similares, como el ejemplo que proporcionaste. Si la estructura del JSON puede variar, es posible que necesites agregar comprobaciones adicionales o modificar la lógica de análisis en consecuencia.

Comments are closed.