2016-10-27 19 views
0

そんなに夢中ですが、何らかの理由でJSONをJSONに変換しようとしています。私はjsonを持っており、jsonをhttp://jsonlint.comにチェックしました。javascriptでJSONをJSONに解析する方法は?

{"d": "[{\"ID\":\"VN00000123\",\"NAME\":\"JOHN GREEN\",\"GENDER\":\"Male\",\"BIRTHDAY\":\"15-10-1987\"},{\"ID\":\"VN00000456\",\"NAME\":\"MERRY BLUE\",\"GENDER\":\"Female\",\"BIRTHDAY\":\"03-12-1983\"},{\"ID\":\"VN00000789\",\"NAME\":\"BLACK BROWN\",\"GENDER\":\"Male\",\"BIRTHDAY\":\"09-07-1990\"}]"} 

さて、私は必要なもの(javascriptやjqueryのを使用して)私と一緒に、このために以下の

{ 
    "columns": [ 
     ["ID"], 
     ["NAME"], 
     ["GENDER"], 
     ["BIRTHDAY"] 
    ], 
    "data": [ 
     [ 
      "VN00000123", 
      "JOHN GREEN", 
      "Male", 
      "15-10-1987" 
     ], 
     [ 
      "VN00000456", 
      "MERRY BLUE", 
      "Female", 
      "03-12-1983" 
     ], 
     [ 
      "VN00000789", 
      "BLACK BROWN", 
      "Male", 
      "09-07-1990" 
     ] 
    ] 
} 

Somebody'veアイデアで、このようにシェアを変換します。どうもありがとうございます。

+3

何か試しましたか? –

+0

まず、 'JSON.parse(obj.d)'を使って解析する必要があります。そこから、ループで目的の構造を作成できるはずです。 – 4castle

+0

私は '$ .parseJSON(json)'を 'object'に使い、' \ "で分割するつもりだと思っていますが、@@ –

答えて

3

このアルゴリズムは非常に簡単です - 以下のようなものが動作するはずです:

function parse(a) { 
 
    //create object to return 
 
    var ret = { 
 
    columns: [], 
 
    data: [] 
 
    }; 
 

 
    //iterate the source array 
 
    a.forEach(function(item, i) { 
 
    if (i === 0) { 
 
     //first time through, build the columns 
 
     for (var key in item) { 
 
     ret.columns.push(key); 
 
     } 
 
    } 
 

 
    //now build your data item 
 
    ret.data[i] = []; 
 

 
    //use the column array to guarantee that the order of the fields in the source string doesn't matter 
 
    for (var j = 0; j < ret.columns.length; j++) { 
 
     var key = ret.columns[j]; 
 
     ret.data[i].push(item[key]); 
 
    } 
 
    }); 
 
    return ret; 
 
} 
 

 
var j = { 
 
    "d": "[{\"ID\":\"VN00000123\",\"NAME\":\"JOHN GREEN\",\"GENDER\":\"Male\",\"BIRTHDAY\":\"15-10-1987\"},{\"NAME\":\"MERRY BLUE\",\"BIRTHDAY\":\"03-12-1983\",\"ID\":\"VN00000456\",\"GENDER\":\"Female\"},{\"GENDER\":\"Male\",\"ID\":\"VN00000789\",\"NAME\":\"BLACK BROWN\",\"BIRTHDAY\":\"09-07-1990\"}]" 
 
}; 
 

 
//j is an object with one property (d) that is a JSON string that needs parsing 
 
var o = parse(JSON.parse(j.d)); 
 
console.log(o);

+0

親愛なる@dave、まずこのアルゴリズムについてありがとうございます。しかし、結果はさらにID、NAME、GENDER、BIRTHDAYと表示されます。 –

+0

私は希望の出力を誤読しました。データが2D配列になるように答えを編集しました。 – dave

2

あなたはjQueryのを使用してこの例を試すことができます。

https://jsfiddle.net/de02fpha/ 

var dump = {"d": "[{\"ID\":\"VN00000123\",\"NAME\":\"JOHN GREEN\",\"GENDER\":\"Male\",\"BIRTHDAY\":\"15-10-1987\"},{\"ID\":\"VN00000456\",\"NAME\":\"MERRY BLUE\",\"GENDER\":\"Female\",\"BIRTHDAY\":\"03-12-1983\"},{\"ID\":\"VN00000789\",\"NAME\":\"BLACK BROWN\",\"GENDER\":\"Male\",\"BIRTHDAY\":\"09-07-1990\"}]"}; 
 

 
var parse = function(json) { 
 
    var columns = []; 
 
    var data = []; 
 
    $.each(json, function(index, row) { 
 
    var element = []; 
 
    for (var key in row) { 
 
     if (columns.indexOf(key) == -1) \t columns.push(key); 
 
     element.push(row[key]); 
 
    } 
 
    data.push(element); 
 
    }); 
 

 
    return {columns: columns, data: data}; 
 
}; 
 

 

 
var json = $.parseJSON(dump.d); 
 
console.log(parse(json));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
JavaScriptで

+0

とてもいいですね、@Thanh TRAN CONG –

+1

この回答の問題は、JSON文字列のフィールドの順序に依存していることです。たとえば、2番目の項目に名前が最初の位置であり、IDが2番目の位置である場合、それらのフィールドは列配列と同じ順序で常に表示されるとは限りません。 – dave

0

JSONクラスに建てられ、あなたのJSONをフォーマットする必要がある2つのツールを提供し、jqueryのための必要性:

JSON.parse()は、テキストを解析処理していないだろう、とJSON.stringifyは、私たちの解析されたJSONを取って、旋回処理することができます素敵なかわいい文字列に変換します。

一緒に叩いてみましょう。解析とJSONを格納して

スタート:

var parsedData = JSON.parse(dataToFormat);

は今私達の解析されたデータを印刷するために、我々は、stringify functionについて少し学ぶために、具体的にそのspace引数を必要としています。パーMDN:

JSON.stringify(value[, replacer[, space]])

空間の引数は、最終的な文字列内の間隔を制御するために使用することができます。数値の場合、文字列の連続する各レベルは、この多くのスペース文字(最大10文字)でインデントされます。文字列の場合、連続するレベルはこの文字列(またはその最初の10文字)で字下げされます。

JSON.stringify({ uno: 1, dos: 2 }, null, '\t'); 
// returns the string: 
// '{ 
//  "uno": 1, 
//  "dos": 2 
// }' 

上記のコードサンプルは、タブ文字を使用しますが、ドキュメントで説明したようにあなたは、単に番号を挿入することができ、それはスペースの代わりにその番号を使用することに注意してください。

よしこれできれいにフォーマットされ、インデントされた文字列が含まれている必要がありますのは、

var prettyData = JSON.stringify(parsedData, null, '\t');

prettyDataを印刷してみましょう。

あなたがしたい場合は、1行にこれを投げることができます。

var prettyData = JSON.stringify(JSON.parse(dataToFormat),null,'\t');

を使用すると、JSONオブジェクトの最上部にキーか何かを追加したい場合、あなたは、単に定義することができ、何らかの種類のキーオブジェクトをJSON.stringifyに渡すオブジェクトにアタッチします。 JSON.parseは標準オブジェクトを提供しますので、他のオブジェクトと同様に変更してください。