Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

236
Vistas
La consulta de MySQL devuelve una cadena como resultado de JSON_OBJECT()

Escribí una consulta que me da publicaciones de una tabla y también devuelve información sobre el autor de cada publicación:

 SELECT post.id, post.text, post.datetime, JSON_OBJECT( 'username', user.username, 'firstName', user.firstName, 'firstName', user.lastName) as author FROM post INNER JOIN user ON post.authorId = user.id;

Pero en respuesta, el campo de author es una cadena:

 author: "{"username": "@", "firstName": null}" datetime: "2017-05-02T20:23:23.000Z" id: 10 text: "5555"

Traté de arreglar eso usando CAST pero de todos modos el author es una cadena:

 CAST(JSON_OBJECT( 'username', user.username, 'firstName', user.firstName, 'firstName', user.lastName) as JSON) as author

¿Por qué sucedió y cómo solucionarlo?

UPD:

Envío los datos desde el servidor usando Node.js y Express:

 app.get('/posts', (req, res, next) => { getPosts().then((posts) => { res.setHeader('Content-Type', 'application/json'); res.send(posts); }) .catch(next); }); // ... getPosts() { return new Promise((resolve, reject) => { const query = ` SELECT post.id, post.text, post.datetime, JSON_OBJECT( 'username', user.username, 'firstName', user.firstName, 'firstName', user.lastName) as author FROM post INNER JOIN user ON post.authorId = user.id;`; this.connection.query(query, (err, result) => { if(err) { return reject(new Error("An error occured getting the posts: " + err)); } console.log(result) // prints author as a string resolve(result || []); }); }); }

Resultado de console.log :

 { id: 1, text: 'hello, world!', datetime: 2017-05-02T15:08:34.000Z, author: '{"username": "@", "firstName": null}' }

También intenté aquí cambiar res.send(posts) a res.json(posts) pero no ayuda.

Mi función del cliente que toca el servidor para las publicaciones:

 export const getPosts = () => { customFetch(apiUrl + '/posts') .then(response => response.json()) .then(json => json) };
about 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

Creo que está bien que MySQL devuelva una cadena, ya que la función JSON_OBJECT() ya está haciendo su trabajo al producir una cadena que representa un JSON bien formateado.

Puede convertir esa cadena en un objeto JSON en javascript con

 var obj = JSON.parse(yourString);

Editar (sobre objetos JSON y Javascript)

En primer lugar, en caso de que no lo supiera, JSON significa Notación de objetos de JavaScript: eso significa que es una forma textual de representar objetos de JavaScript.

Desde el punto de vista de MySQL, ya está resolviendo este problema dentro de la declaración SELECT , porque lo que devuelve la consulta es un JSON válido.

El caso es que entonces esos datos se transmiten a Javascript (Node), pero no es lo mismo la representación interna de Javascript de un objeto que su representación textual (el JSON); esto significa que tiene que "lanzarlo", para que la cadena se convierta en el objeto.

El mecanismo que necesitaría para evitar este lanzamiento requeriría que MySQL sepa cómo Javascript representa un objeto y luego usar ese conocimiento para devolver el código de bytes de su objeto. Esto se llama serialización, y me temo que va más allá del propósito de un dbms como MySQL.

Espero que esto aclare un poco tus dudas...

about 4 years ago · Santiago Trujillo Denunciar

0

¿Qué hay de devolver todo como un JSON_OBJECT y hacer JSON.Parse una vez?

 SELECT JSON_OBJECT("id", post.id, "text", post.text, "datetime", post.datetime, "author", JSON_OBJECT( 'username', user.username, 'firstName', user.firstName, 'firstName', user.lastName)) FROM post INNER JOIN user ON post.authorId = user.id;

Eso elimina la necesidad de hacer un bucle

about 4 years ago · Santiago Trujillo Denunciar

0

Usé JSON typeCast en el archivo de configuración de DB

 connection: { .. host: process.env.DB_HOST, user: process.env.DB_USER, .. typeCast: function (field, next) { if (field.type == 'JSON') { return (JSON.parse(field.string())); } return next(); }, .. }
about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda