2017-01-04 5 views
1

値仕様から引用符を削除し、この:私はこのJavascriptを/ jQueryのは、JSONは今、私は私に返すのAJAX呼び出しを持っている

"nodes": 
     [ 
      {"ID":"87","score":"-0.2","dscore":"-0.4","x":250,"y":250,"name":"TEST","ticker":"TEST","datafrom":"0000-00-00","r":"28","fixed":"true","color":"grey"} 
] 

だから本当の違いは"x""y"の間である必要がある

"nodes": 
     [ 
      {"ID":"87","score":"-0.2","dscore":"-0.4","x":"250","y":"250","name":"TEST","ticker":"TEST","datafrom":"0000-00-00","r":"28","fixed":"true","color":"grey"} 
] 

最初の例は二重引用符で、2番目は二重引用符ではありません。私はd3.jsのためにこれを使用していますので、引用符なしにする必要があります、そして、私はそれをたくさん引っ張っています、それはただ一つの行でした。だから、私はPHP/ajax/javascriptを使ってこれを解析することができます。私はどのように全体のことを解析するつもりですか?

私はデータベースからこの情報を取得するためにPHPを使用して以来、私はを実行しているので、私はPHPと言ったので、そこにもparase可能です。

答えて

1

ここで問題となるのは、ソースデータがjsonエンコードされている場合、nodes配列のすべてのフィールドに "string"タイプがあるため、jsonエンコーダでそれらを文字列として引用符でエンコードします。

これを修正する最も正しい方法は、ソースデータに正しいタイプを割り当てることです。そうすれば、jsonエンコーダは数値として引用符でエンコードします。

あなたがそれらをJSONエンコード前あなたが返事で取得 JSON、そしてちょうどintval/floatval番号を生成する側の任意のコントロールを持っている場合。

これがない場合は、js側で変換してからd3に渡します。 xyに含める値のタイプに応じて、parseInt(nodes[i].x, 10)またはparseFloat(nodes[i].y, 10)を使用してください。 JSの文字列をJSの数値に変換するときは、2番目のパラメータ "基数"を指定することが常に重要です。また、数字が0から始まる場合は8進数としてJSエンジンで解釈される可能性があります。詳細はMDNを参照してください。参考のため

$ php -r '$a = ["test" => "1.25"]; echo json_encode($a) . PHP_EOL;' 
{"test":"1.25"} 
     ^
$ php -r '$a = ["test" => 1.25]; echo json_encode($a) . PHP_EOL;' 
{"test":1.25} 
     ^
+0

私はデータを生成する側を完全に制御していますが、私はそれをまったく解析しません。私は次のようにします: '$ grabme = $ db-> query(" SELECT * FROM sometable WHERE somecol = '$ somecol' ORDER BY ID DESC '); $ res = $ grabme-> fetchAll(PDO :: FETCH_ASSOC); $ data ['nodes'] = $ res; ' 私は基本的に後でjsonとしてエコーします。 '$ data ['nodes']'配列を繰り返し処理し、 'x'と' y'値の前後の引用符を削除したいですか?残りのデータオーダーを乱すことなくこれを行う最も効率的な方法は何でしょうか? –

+0

ああ、私は小さなpythonスクリプトのこの問題を経験しましたが、Pythonのlibの能力を使ってさまざまなフィールドの型を指定することで修正しました。結果を取得するときに、すでに必要な型に型キャストされています手動変換に多くの時間を費やすこともできました)。 PHPのPDOで可能かどうかわかりません(疑わしい)。しかし、あなたが本当に知っていれば、どのフィールドが整数で返されるべきか(例ではx、y)、次にそれらをフェッチした直後に手動で変換してください: –

+1

'' 'foreach($ data ['nodes'] as $ k => $ v){$ v ['x'] = intval($ v ['x']); $ v ['y'] = intval($ v ['y']); $データ['nodes'] [$ k] = $ v; } '' ' –

1

parseIntを使用して、文字列値を整数に変換できます。

var x = parseInt(jsonObj.get("x"), 10); 

10は、解析時に10を使用します。

+0

ありがとうございました!しかし、私はPHPメソッドを選んだのは単純で、クライアント側ではなくサーバー上で起こるからです。どうやらもっと安全だと感じています。しかしこれもうまくいった! –

+0

フィードバックをいただきありがとうございます。うれしいことに、PHPで把握できました – Loaf

関連する問題