Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

242
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!