1

Buenas,

Modifico la pregunta.

Como puedo recorrer en NODEJS JavaScript este JSON:

{
  "subscriptionId" : "5a268a598dc68904bbc7b3cf",
  "originator" : "localhost",
  "contextResponses" : [
    {
      "contextElement" : {
        "type" : "Temperatura",
        "isPattern" : "false",
        "id" : "S_Temp001",
        "attributes" : [
          {
            "name" : "Tem_int",
            "type" : "float",
            "value" : 2,
            "metadatas" : [
              {
                "name" : "accuracy",
                "type" : "Float",
                "value": 2              }
            ]
          },
          {
            "name" : "Tem_out",
            "type" : "Integer",
            "value" : 1
          }
        ]
      },
      "statusCode" : {
        "code" : "200",
        "reasonPhrase" : "OK"
      }
    }
  ]
}

Un Saludo y gracias.

EDIT01

Ahora mismo la respuesta que tengo es:

[ [ 'S_Temp001', 'Temperatura', 'Tem_int', 'float', 2, 'accuracy', 'Float',2 ] ]

Lo estoy guardando en BD de tal forma (funciona correctamente):

var sql = "INSERT INTO inver (fiwareServicePath, entityId,  entityType, attrName, attrType, attrValue) VALUES ?";

connection.query(sql, [tmp], function(err, rows) {
          if(err)
          {
            throw err;
            console.log('Error al Conectar' + error);
          }
          else
          {
            res.status(200).json(rows);
          }
        });

Ahora mi duda: Solo estoy guardando lo que pertenece al attributes[0] Necesito generar otro array separado por , y insertado dentro de [] en el mismo array de tmp es decir algo asi:

var tmp= [['S_Temp001', 'Temperatura', 'Tem_int', 'float', 2, 'accuracy',
'Float',2],['S_Temp001', 'Temperatura', 'Tem_out', 'Integer', 1, 'accuracy',
'Float',2]];

Para los metadatos he añadido esto en el código que me has proporciondo:

   json["contextResponses"][i].contextElement.attributes[0].metadatas[0].name,
     json["contextResponses"][i].contextElement.attributes[0].metadatas[0].type,
     json["contextResponses"][i].contextElement.attributes[0].metadatas[0].value]);

Lo necesito así para insertar esta lista en mi base de datos y cada array de dentro en una nueva fila, así se quedaría el ejemplo que te he puesto:

Imagen1

Supongo que tengo que generar un nuevo for dentro de este for (var i = 0; i < json["contextResponses"].length; i++) para que recorra los atributos y los añada como un nuevo array con la estructura que te he comentado antes.

var tmp= [['S_Temp001', 'Temperatura', 'Tem_int', 'float', 2, 'accuracy',
    'Float',2],['S_Temp001', 'Temperatura', 'Tem_out', 'Integer', 1, 'accuracy',
    'Float',2]];

No se si me he explicado bien.

gracias.

EDIT02 Solución

Buenas,

ya he encontrado la solución, la añado por si le puede valer a alguien.

  var tmp2 = [];
      for (var i = 0; i < params.contextResponses.length; i++) {
        for (var j = 0; j < params.contextResponses[i].contextElement.attributes.length; j++) {
          for (var k = 0; k < params.contextResponses[i].contextElement.attributes[j].metadatas.length; k++) {
            console.log("nuevo log antes de petar: " + params["contextResponses"][i].contextElement.attributes[j].metadatas[k].value);

            tmp2.push([params.contextResponses[i].contextElement.id,
                     params.contextResponses[i].contextElement.type,
                     params.contextResponses[i].contextElement.attributes[j].name,
                     params.contextResponses[i].contextElement.attributes[j].type,
                     params.contextResponses[i].contextElement.attributes[j].value,
                     params.contextResponses[i].contextElement.attributes[j].metadatas[k].name,
                     params.contextResponses[i].contextElement.attributes[j].metadatas[k].type,
                     params.contextResponses[i].contextElement.attributes[j].metadatas[k].value]);
            console.log("tmp2 --> ",tmp2);
          }
        }
    }

Un saludo y gracias por la ayuda.

Manolait
  • 521
  • 8
  • 16
  • ¿Estás usando Express? ¿Has puesto el bodyParser? – gugadev Dec 05 '17 at 13:00
  • Buenas, si estoy usando express y bodyParser.@gugadev – Manolait Dec 05 '17 at 13:49
  • Acabo de editar el POST por si sirve de ayuda! – Manolait Dec 05 '17 at 14:16
  • Pregunto donde estás guardando ese JSON? Sería tan facil como almacenarlo en una variable y accederlo mediante **.** – Agustin M. Dec 05 '17 at 19:30
  • Mi idea es insertar el JSon que me llega al método en la base de datos, pero solo necesito x campos y no todos. – Manolait Dec 05 '17 at 21:05
  • trata de no usar variables var en javascript [carga mas en memoria y es mas lento](https://stackoverflow.com/a/21467841/5695795), usa tipo let ademas tambien te invito a [chequear esta respuesta](https://es.stackoverflow.com/questions/106042/var-let-const-o-nada-en-javascript/106067#106067) – JackNavaRow Dec 14 '17 at 13:16

2 Answers2

3
  let json = {
    "subscriptionId" : "5a268a598dc68904bbc7b3cf",
    "originator" : "localhost",
    "contextResponses" : [
      {
        "contextElement" : {
          "type" : "Temperatura",
          "isPattern" : "false",
          "id" : "S_Temp001",
          "attributes" : [
            {
              "name" : "Tem_int",
              "type" : "float",
              "value" : 2,
              "metadatas" : [
                {
                  "name" : "accuracy",
                  "type" : "Float",
                  "value": 2              }
              ]
            },
            {
              "name" : "Tem_out",
              "type" : "Integer",
              "value" : 1
            }
          ]
        },
        "statusCode" : {
          "code" : "200",
          "reasonPhrase" : "OK"
        }
      },
      {
        "contextElement" : {
          "type" : "Temperatura",
          "isPattern" : "false",
          "id" : "S_Temp002",
          "attributes" : [
            {
              "name" : "Tem_int1",
              "type" : "float1",
              "value" : 3,
              "metadatas" : [
                {
                  "name" : "accuracy1",
                  "type" : "Floa1t",
                  "value": 3              }
              ]
            },
            {
              "name" : "Tem_out",
              "type" : "Integer",
              "value" : 1
            }
          ]
        },
        "statusCode" : {
          "code" : "200",
          "reasonPhrase" : "OK"
        }
      }
    ]
  };
  for (let ele in json) {
    //aquí para los que son objetos
    if (typeof(json[ele]) == 'object') {
      eachobject(json[ele]);
    } else {
      console.log('ele --> ', ele, ' - ', json[ele]);
      console.log('typo del ele --> ', typeof(json[ele]));
      console.log(' --------------------- ');
    }
  }

  function eachobject(json) {
    for (let ele in json) {
      if (typeof(json[ele]) == 'object') {
        eachobject(json[ele]);
      } else {
        console.log('ele --> ', ele, ' - ', json[ele]);
        console.log('typo del ele --> ', typeof(json[ele]));
        console.log(' --------------------- ');
      }
    }
  }

  let tmp = [];
  for (let i = 0; i < json["contextResponses"].length; i++) {
    console.log("Attributes --> ", json["contextResponses"][i]);
    tmp.push([json["contextResponses"][i].contextElement.id,
         json["contextResponses"][i].contextElement.type,
         json["contextResponses"][i].contextElement.attributes[0].name,
         json["contextResponses"][i].contextElement.attributes[0].type,
         json["contextResponses"][i].contextElement.attributes[0].value,
         json["contextResponses"][i].contextElement.attributes[0].metadatas[0].name,
         json["contextResponses"][i].contextElement.attributes[0].metadatas[0].type,
         json["contextResponses"][i].contextElement.attributes[0].metadatas[0].value]);
    console.log("tmp --> ",tmp);
  }

Modifique el JSON pensando mas menos en lo que tu necesitas para que lo veas, y al final agregue un for en el que la DATA queda en el formato que tu necesitas (puedes hacerte igual una forma de como hacerlo en caso de que no se exactamente lo que necesitas). Aun así igual avísame en caso de que no sea lo que necesitas y si es posible entregarme un poco mas de detalles para dar una respuesta mas certera.
Espero si aun no habías podido solucionarlo espero esto te sirva o si tienes una forma más fácil de hacer lo pedido comparte :)
PD: Es solo para recorrer el objeto completo si necesitas mas cosas avisa.
PD: Perdón la tardanza no había tenido mucho tiempo y una actualización me dejo la embarrada en mi note xD.

  • Hola, estaba realizando dos for anidados etc. Pero esta solución es mejor que la mía, gracias. Una duda podría Generar un array y dentro de este a su vez otros arrays con la información de X campos del JSON es decir algo asi, var values = [ ['id', 'type', 'name', 'type', 'value', 'metadatas'], ['id', 'type', 'name', 'type', 'value', 'metadatas'], ['id', 'type', 'name', 'type', 'value', 'metadatas'], ['id', 'type', 'name', 'type', 'value', 'metadatas'], ['id', 'type', 'name', 'type', 'value', 'metadatas'] ]; – Manolait Dec 11 '17 at 15:28
  • Lo necesito así para insertarlo en my BD una vez que llegue el JSON – Manolait Dec 11 '17 at 15:39
  • Tengo una duda con respecto a lo último que me preguntaste, imagino que el JSON lo que esta dentro del "contextElement" se repetirá varias veces?. Por ej. "contextElement" : { datos 1 }, { datos 2 }, { datos n } o es el "contextResponses" el que dentro del array entregara mas de un resultado de "contextElement". (No se si se entendió muy bien). Por que tu finalmente quieres que quede como value = [['S_Temp001','Temperatura','Tem_int','float',2,['accuracy','float',2]],[...]] – FdoContreras Dec 11 '17 at 18:59
  • 1
    Buenas, Si como has comentado contextElement siempre es la posicion[0], lo que me interesa es esa información y la los atributos. he probado con esto x.push ( json[ele]); en cada iteracion del bucle para añadir a un array vació, pero no consigo el formato que te he comentado arriba, ya que tengo un método para insertar que tiene esta estructura de ejemplo: var sql = "INSERT INTO inver (fiwareServicePath, entityId) VALUES ?"; var values = [ ['John', 'Highway 71'] ]; connection.query(sql, [values], function(err, rows) { Gracias por la ayuda de verdad – Manolait Dec 11 '17 at 21:15
  • no se si con lo que te he comentado he aclaro la duda que tenías, estoy parado en el desarrollo por ese motivo y no se ya como buscar eso... – Manolait Dec 13 '17 at 00:03
  • Te sirvió lo que agregue? – FdoContreras Dec 13 '17 at 13:07
  • Buenas, la verdad que si me vale lo que me has comentado, solo falta un poco para terminar de afinar lo que necesito. Ahora mismo tengo me da esta respuesta tmp --> [ [ 'S_Temp001', 'Temperatura', 'Tem_int', 'float', 2, [ [Object] ] ] ] Edito el POST para enseñarte como tendria que quedar finalmente. Gracias tio de verdad – Manolait Dec 14 '17 at 12:18
  • trata de no usar variables var en javascript [carga mas en memoria y es mas lento](https://stackoverflow.com/a/21467841/5695795), usa tipo let ademas tambien te invito a [chequear esta respuesta](https://es.stackoverflow.com/questions/106042/var-let-const-o-nada-en-javascript/106067#106067) – JackNavaRow Dec 14 '17 at 13:12
  • Gracias por la acotación, había escuchado hace poco del tipo let pero aun no lo investigaba. – FdoContreras Dec 14 '17 at 13:16
  • Gracias por la aclaración con las variables var. @FdoContreras has entendido mas o menos en el EDIT01 del post como tendria que quedar el array? – Manolait Dec 14 '17 at 19:18
  • Buenas, supongo que no abras tenido tiempo para terminar de ayudarme, ¿has podido mirar el edit del post? Un saludo – Manolait Dec 17 '17 at 15:39
  • 1
    Hola, disculpa la ausencia. Si te fijas el for q esta al final del codigo retorna un arreglo de arreglos con el formato q tu necesitas. var tmp= [['S_Temp001', 'Temperatura', 'Tem_int', 'float', 2, 'accuracy', 'Float',2],['S_Temp001', 'Temperatura', 'Tem_out', 'Integer', 1, 'accuracy', 'Float',2]]; – FdoContreras Dec 18 '17 at 14:56
1

si solo requieres ciertos valores del json, podrias usar destructuring, aquí pongo un ejemplo de lo que me refiero:

var json = {
    "name": {
        "first": "Yosuke",
        "family": "Kyra"
    },
    "birth": {
        "year": 1982,
        "month": 12,
        "day": 5
    }
}
// Destructuring
var {name: { family: familyName }, birth: {day: birthDay}} = json
console.log(familyName) // return Kyra
console.log(birthDay) // return 5

Mas sobre el tema => https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Operadores/Destructuring_assignment

kiramishima
  • 483
  • 3
  • 10
  • otra forma seria obtener las keys del objecto json y con un foreach ir iterando dentro del objecto hasta dar con las keys que contiene los valores que ocupas – kiramishima Dec 06 '17 at 22:31