2017-05-03 10 views
0

私は私のテーブルからの投稿を与え、また、各ポストの著者に関する情報を返すクエリ書いた:MySQLのクエリはJSON_OBJECT(の結果として文字列を返します)

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; 

をしかし、応答にauthorフィールドがあります文字列:

CAST(JSON_OBJECT(
    'username', user.username, 
    'firstName', user.firstName, 
    'firstName', user.lastName) as JSON) as author 
:私は CASTとにかく authorを使用していることを修正しようとした

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

は文字列です0

なぜそれが起こったのですか、それを修正する方法は?

UPD:

私はNode.jsのとExpressを使用してサーバからのデータを送信します。console.log

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 || []); 
      }); 
     }); 
    } 

結果:

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

私もここにしようとしたがres.json(posts)res.send(posts)を変更するが、それは助けにはならない。

投稿をサーバーに触れクライアントからMy機能:

export const getPosts =() => { 
    customFetch(apiUrl + '/posts') 
    .then(response => response.json()) 
    .then(json => json) 
}; 
+1

何かをあなたの必要性を排除し

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; 

一度に解析します。それは何ですか? – e4c5

+0

私はjavascriptを使用しています – rel1x

+0

私はノードエキスパートではありませんが、私が理解していることは、悲しいことに、あなたが選択したものがjsonオブジェクトをサポートしていないように見えるRDBMSへの接続方法が複数あります。結局のところJSONは最近mysqlに追加されたものです – e4c5

答えて

1

私は、MySQLが文字列を返すようにするためにJSON_OBJECT()機能はすでによくを表す文字列を生成することによって、その仕事をしているとして、それは、罰金だと思いますフォーマットされたJSON

あなたはケースにあなたが知らなかった、(JSONとJavaScriptオブジェクトについて)

var obj = JSON.parse(yourString); 

編集すべての

まずとJavaScriptでJSONオブジェクトにその文字列を変換することができ

、JSON JavaScript Object Notation:JavaScriptオブジェクトを表すテキスト的な方法を意味します。

MySQLの観点からは、SELECTステートメント内でこの問題を解決しています。クエリが返すものは有効なJSONです。

事実、そのデータはJavascript(Node)に送信されますが、オブジェクトのJavascript内部表現はそのテキスト表現(JSON)と同じではありません。これは、文字列をオブジェクトに変換するために、 "キャスト"する必要があることを意味します。

このキャストを避けるために必要なメカニズムでは、Javascriptがオブジェクトをどのように表しているかを知り、その知識を使ってオブジェクトのバイトコードを返す必要があります。これはシリアライズと呼ばれ、MySQLのようなdbmsの目的を超えたものです。これは少しあなたの疑問を明確に

希望...

+0

私はそれを 'response => response.json()'とします。それとも、jsonにもなるJSONの各キーを探し、 'JSON.parse'を使う必要がありますか? – rel1x

+0

はい、応答全体は有効なJSONではありませんが、 'author'フィールドは確かになります。 –

+0

さて、テーブルからデータを取得し、データを繰り返し処理し、それぞれの著者を 'JSON.parse(post.author)'で変更してクライアントに送信します。それは今はうまくいくが、見た目はとても奇妙だ。実際に 'SELECT'の問題を解決する方法はありませんか? – rel1x

0

何JSON_OBJECTとして全体を返すとJSONをやっについて。ループに使用しているプログラミング言語に固有おそらく

関連する問題