Formato de cadena AWS GraphQL JSON

Estoy intentando crear un valor de objeto para pasar a DynamoDB usando AWS AppSync y GraphQL. Estoy muy cerca de lo que necesito pero estoy tropezando con JSON anidado.

Digamos que tengo un array:

let officers = [{"id":"0","IgRole":"Role1","IgName":"testname1","IgEmail":"testemail1","IgPhone":"testphone1","IgStart":"teststart1","IgEnd":"testend1"},
                {"id":"1","IgRole":"Role2","IgName":"testname2","IgEmail":"testemail2","IgPhone":"testphone2","IgStart":"teststart2","IgEnd":"testend2"}]

Ahora quiero crear un objeto con cada uno de los valores de array como objeto infantil así que, hago esto:

for (let i in officers) {
      officersJson['"' + officers[i].IgRole + '"'] = '{"Name":"' + officers[i].IgName + '","Email":"' + officers[i].IgEmail + '","Phone":"' + officers[i].IgPhone + '","Date commenced":"' + officers[i].IgStart + '","Date to end":"' + officers[i].IgEnd + '"}';
    }

Aquí están los resultados:

Object {
    "Role1": "{'Name':'testname1','Email':'testemail1','Phone':'testphone1','Date commenced':'teststart1','Date to end':'testend1'}",
    "Role2": "{'Name':'testname2','Email':'testemail2','Phone':'testphone2','Date commenced':'teststart2','Date to end':'testend2'}"
}

Creo que el problema es que cada clave / valor entero no está en formato de cadena. Si miras "Role1": "{......Puedes ver que la cuerda se rompe.

y esta es la respuesta de AWS:

Variable 'Officers' has an invalid value. Unable to parse {\"Role1\"={\"Nam

Ver el signo

¿Cómo puedo formatear el objeto en una cadena JSON completa? Me complació bastante que me las arreglé para acercarme al formato que necesitaba, pero esta última parte me ha picado.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por daniel1


3 Respuestas:

  • Finalmente funcionó. Necesitaba un enfoque ligeramente diferente. Publicarlo en caso de que ayude a alguien más:

    En primer lugar he creado una serie de roles, ya que éstas serán las claves para los objetos de valor:

    for (let i in officers) {
          roles.push(officers[i].IgRole);
        }
    

    Luego creé un nuevo array.

    let arrOfficers = [];
    
    for (let i in officers) {
          arrOfficers.push(officers[i]);
        }
    

    Luego uso una función para crear objetos de un array:

     function groupBy(objectArray, property) {
          return objectArray.reduce(function (acc, obj) {
            let key = obj[property];
            if (!acc[key]) {
              acc[key] = [];
            }
            acc[key].push(obj);
            return acc;
          }, {});
        }
    
        let newresult = groupBy(arrOfficers, "IgRole");
    

    Finalmente yo creo mi objeto y luego lo encadeno:

     let officersJson = {};
    
        for (let i in roles) {
           officersJson[roles[i]] = newresult[roles[i]][0];
        }
    
    theObjectIwant = JSON.stringify(officersJson)
    

    Respondida el Dec 18, 2020 a las 13:49 - por devninjax

    Votos positivos: 0 | Votos negativos: 0

  • El problema principal parece ser la forma en que estás creando y asignando los valores a tus objetos JSON en JavaScript. En lugar de intentar concatenar cadenas manualmente para formar el JSON, puedes crear un objeto JavaScript directamente y luego usar JSON.stringify() para convertirlo en un formato JSON válido.

    Aquí te dejo un ejemplo de cómo modificar tu código para lograrlo:

    javascript
    let officers = [
        {"id":"0","IgRole":"Role1","IgName":"testname1","IgEmail":"testemail1","IgPhone":"testphone1","IgStart":"teststart1","IgEnd":"testend1"},
        {"id":"1","IgRole":"Role2","IgName":"testname2","IgEmail":"testemail2","IgPhone":"testphone2","IgStart":"teststart2","IgEnd":"testend2"}
    ];
    
    let officersJson = {};
    
    for (let i in officers) {
        officersJson[officers[i].IgRole] = {
            Name: officers[i].IgName,
            Email: officers[i].IgEmail,
            Phone: officers[i].IgPhone,
            "Date commenced": officers[i].IgStart,
            "Date to end": officers[i].IgEnd
        };
    }
    
    let officersJsonString = JSON.stringify(officersJson);
    
    console.log(officersJsonString);
    

    En este código, primero creamos un objeto officersJson y dentro del bucle for asignamos directamente los valores de cada oficial como propiedades de este objeto. Luego, utilizamos JSON.stringify() para convertir el objeto en una cadena JSON completa y válida.

    Al correr este código, obtendrás un resultado similar a:

    
    {"Role1":{"Name":"testname1","Email":"testemail1","Phone":"testphone1","Date commenced":"teststart1","Date to end":"testend1"},"Role2":{"Name":"testname2","Email":"testemail2","Phone":"testphone2","Date commenced":"teststart2","Date to end":"testend2"}}
    

    Esta cadena JSON completa y válida debería funcionar correctamente cuando la pases a AWS AppSync y GraphQL. ¡Espero que esto resuelva tu problema!

    Respondida el Dec 19, 2020 a las 13:51 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El problema con tu código es que estás intentando crear un objeto JSON dentro de una cadena. Para resolver este problema, puedes utilizar la función JSON.stringify() para convertir el objeto en una cadena JSON válida.

    Aquí tienes el código corregido:

    
    for (let i in officers) {
      officersJson['"' + officers[i].IgRole + '"'] = JSON.stringify({
        Name: officers[i].IgName,
        Email: officers[i].IgEmail,
        Phone: officers[i].IgPhone,
        "Date commenced": officers[i].IgStart,
        "Date to end": officers[i].IgEnd,
      });
    }
    

    Esto creará un objeto JSON válido con las claves y valores correctos.

    Respondida el Dec 19, 2020 a las 13:52 - por Gemini

    Votos positivos: 0 | Votos negativos: 0