2016-04-26 4 views
-1

私はいくつかの列を持つmysqlテーブルを持っています。そのうちの1つは、6つのキーを含むjson文字列を含む '詳細'です。php json_encode()は、mysqlから取り出されたjsonに引用符を追加します。

{ 
    "x": [ 
     -0.02, 
     -0.04, 
     -0.05 
    ], 
    "y": [ 
     -0.01, 
     0, 
     0, 
     -0.01 
    ], 
    "z": [ 
     0.04, 
     0, 
     -0.03, 
     -0.01 
    ], 
    "roll": [ 
     0.5, 
     0.6, 
     0.6 
    ], 
    "pitch": [ 
     -3.4, 
     -3.3, 
     -3.3 
    ], 
    "yaw": [ 
     224.2, 
     224.2, 
     224.2 
    ] } 

次に、PHPでは3つの列を選択します。そのうちの1つはjson列と呼ばれます。

$sql = "SELECT date, speed, detailed FROM info_table"; 
$result = $conn->query ($sql); 

if ($result-> num_rows) { 

    while ($row = $result->fetch_object()) { 
     $rows[] = $row; 

    } 
} 
echo json_encode($rows); 

JavaScriptでは、これらの値を取得して解析するためにAJAX呼び出しを行います。

data = JSON.parse(xmlhttp.responseText); 

これまでのところ、JSONオブジェクトは返されましたが、入れ子になったプロパティなどを取得しようとするとオブジェクトが返されます。

data[1].detailed.x[1] 

「詳細」の後のすべてがオブジェクトではない文字列として処理されるため、定義されていません。

私はjson_encodeの結果をエコーするとき私が得るPHPで、これを原因か知っている:

{「日付」:「2016年4月22日14時50分24秒 」、「スピード」 : "0"、 "詳細" " {\" X \ "[ - 0.02、-O ...]( 出力... REST ...)} "}

大括弧で囲まれた引用符を削除すると、JSON.parse()JavaScriptはこのネストされた値をobject not stringとして正しく見ます。

私の質問は、JSON列をmySQLから取得してPHPでエコーするだけで、PHPで再度エンコードする必要はありません。これは中括弧で囲まれています。

+0

なぜdownvote ? – Johnny

答えて

3

すでにDBにJSONを持っているなら、あなたは全体を符号化する前にそれをデコードする必要があります。

$sql = "SELECT date, speed, detailed FROM info_table"; 
$result = $conn->query($sql); 

if ($result->num_rows) { 

    while ($row = $result->fetch_object()) { 
     $row->detailed = json_decode($row->detailed); 
     $rows[] = $row; 

    } 
} 
echo json_encode($rows); 
2

あなたはそれをjson_encoding前にJSONをパースする必要があります。

while ($row = $result->fetch_object()) { 
    $row->detailed = json_decode($row->detailed); 
    $rows[] = $row; 
} 
+2

'JSON.parse'はJavaScript関数です。あなたはPHPになっています。 – jcubic

+0

@jcubic:修正しました。 –

関連する問題