2016-11-25 10 views
2

私は複数の配列を持つJSONファイルを持っています。 「データ」には、各単語に「手がかり」を含む単語が含まれています。私は1つの配列でJSONファイルを解析しましたが、これを解析する方法は不明です。私はJSONObjectsが{}で囲まれていて、JSONArraysが[]で囲まれていることを知っています。したがって、 "data"はJSONObjectで、各単語は配列でなければなりません。複数の配列を持つJSONファイルを解析するにはどうすればよいですか?

{ 
    "data":{ 
    "abase":[ 
     "put down", 
     "humiliate", 
     "cut down", 
    ], 
    "abate":[ 
     "diminish", 
     "let up", 
    ], 
    "abbot":[ 
     "monastery head", 
     "monastic title", 
    ] 
} 
} 

私は、特異配列とJSONファイルを解析し、そのようにデータからオブジェクトを作成することができます。

JSONObject allThings = loadJSONObject("filename.json"); 
JSONArray arr = getJSONArray("titleofarray"); 
for (int x = 0; x<=arr.size(); x++){ 
    String fieldOne = arr.getJSONObject(x).getString("firstField"); 
    int fieldTwo = arr.getJSONObject(x).getInt("secondField"); 
} 

私はJSONArraysのArrayListのを作成し、それにファイル内の各列を追加することができますFor eachを持つArrayList?申し訳ありませんが、私の質問で100%明確でない場合は、あなたが理解していないことについて語るのは難しいですが、明確化が必要な場合は、私に詳細を説明してください。

編集:私は、処理/ Javaの

+1

なぜJSONファイルを手動で解析したいですか? ** GSON **や** Jackson **のようなJSONの解析にはライブラリを使用できませんか? – misko321

+0

さて、私はデータ構造を学び、ファイルとやりとりしているので、私はこの時点でJSONをよく理解しようとしています。 –

答えて

2

ケビンの答えに加えて、あなたは、反復処理することができますJSONObjectのkeys()

JSONObject associative = loadJSONObject("associative.json"); 
    JSONObject associativeData = associative.getJSONObject("data"); 

    ArrayList<JSONArray> listA = new ArrayList<JSONArray>(); 

    for(Object key : associativeData.keys()){ 
    String keyName = (String)key; 
    JSONArray data = associativeData.getJSONArray(keyName); 
    println(keyName,"=",data); 
    listA.add(data); 
    } 

    System.err.println(listA); 

associative.json:それはあなたの目標に合うように、あなたはまた、あなたのJSONデータを再編成することができ

{ 
    "data":{ 
    "abase":[ 
     "put down", 
     "humiliate", 
     "cut down" 
    ], 
    "abate":[ 
     "diminish", 
     "let up" 
    ], 
    "abbot":[ 
     "monastery head", 
     "monastic title" 
    ] 
} 

} 

。 現在、JSONオブジェクト(結合配列)に単語と同義語があります。 これをJSON配列に簡単に変換し、アクセス/解析が容易なようにデータを構造化することができます。例:あなたがしたい場合は、まだのArrayListを作ることができますが、あなたが本当にそれを必要としないはず

{ 
    "data":[ 
    { 
     "word":"abase", 
     "synonyms":[ 
     "put down", 
     "humiliate", 
     "cut down" 
     ] 
     }, 
     { 
     "word":"abate", 
     "synonyms":[ 
      "diminish", 
      "let up" 
     ] 
    }, 
    { 
     "word":"abbot", 
     "synonyms":[ 
      "monastery head", 
      "monastic title" 
     ] 
     } 
    ] 
} 

array.json、あなたは簡単に、直接各単語と同義語にアクセスすることができます。 それは/変換解析し、ちょうどあなたが必要なものにアクセスする必要がない単純でなければなりません:

ArrayList<JSONArray> listB = new ArrayList<JSONArray>(); 

    JSONObject array = loadJSONObject("array.json"); 
    JSONArray arrayData = array.getJSONArray("data"); 
    for(int i = 0 ; i < arrayData.size(); i++){ 
    JSONObject data = arrayData.getJSONObject(i); 
    println("\t",data.getString("word"),"=",data.getJSONArray("synonyms")); 

    listB.add(data.getJSONArray("synonyms")); 
    } 

    System.err.println(listB); 

更新ここで、画面上のテキストを表示する例を示します

import processing.data.*; 

void setup(){ 
    size(400,400); 
    background(0); 

    int textX = 10; 
    int textY = 20; 

    JSONObject array = loadJSONObject("array.json"); 
    JSONArray arrayData = array.getJSONArray("data"); 
    for(int i = 0 ; i < arrayData.size(); i++){ 
    JSONObject data = arrayData.getJSONObject(i); 
    String word = data.getString("word"); 
    JSONArray synonyms = data.getJSONArray("synonyms"); 
    println(word,"=",synonyms); 

    //render on screen 
    text(word.toUpperCase(),textX,textY); 
    for(int j = 0 ; j < synonyms.size(); j++){ 
     String synonym = synonyms.getString(j); 
     text(synonym,textX,textY + (textY * (j+1))); 
    } 

    //increment x position for next word 
    textX += 100; 
    } 

} 

json text parse and preview

更新2ここでは、単語の上にカーソルを置いたときにコンセプトのヒントディスプレイを使用するカプセル化の例を示します。

import processing.data.*; 

ArrayList<Word> words = new ArrayList<Word>(); 

void setup(){ 
    size(400,400); 

    int textX = 10; 
    int textY = 20; 

    JSONObject array = loadJSONObject("array.json"); 
    JSONArray arrayData = array.getJSONArray("data"); 
    for(int i = 0 ; i < arrayData.size(); i++){ 
    JSONObject data = arrayData.getJSONObject(i); 
    String word = data.getString("word"); 
    JSONArray synonyms = data.getJSONArray("synonyms"); 
    println(word,"=",synonyms); 

    words.add(new Word(textX,textY,"hint #"+(i+1),data)); 

    //increment x position for next word 
    textX += 100; 
    } 

} 

void draw(){ 
    background(0); 
    for(Word word : words){ 
    word.draw(); 
    } 
} 

class Word{ 
    String hint = "..."; 
    JSONObject data; 

    float x,y; 
    float textWidth; 
    float textHeight = 20; 



    Word(float x,float y,String hint,JSONObject data){ 
    this.x = x; 
    this.y = y; 
    this.hint = hint; 
    this.data = data; 
    textWidth = textWidth(data.getString("word")); 
    } 

    void draw(){ 
    fill(255); 
    String word = data.getString("word"); 
    JSONArray synonyms = data.getJSONArray("synonyms"); 
    text(word.toUpperCase(),x,y); 
    for(int j = 0 ; j < synonyms.size(); j++){ 
     String synonym = synonyms.getString(j); 
     text(synonym,x,y + (textHeight * (j+1))); 
    } 
    fill(0,192,0); 
    //hint tooltip 
    //if mouse within word bounding box 
    if((mouseX >= x && mouseX <= x + textWidth) && 
     (mouseY >= y-textHeight && mouseY <= y)){ 
     //render the text at mouse coordinates 
     //be aware that y is the base of the text -> be sure to check out the reference for text functions (e.g. textAscent(),textDescent(),etc.) 
     text(hint,mouseX,mouseY+textHeight); 
    } 


    } 


} 
+0

あなたのお返事ありがとうございます。 Kevinの例では、別のJSONArrayオブジェクトとしてJSONファイルにすべての単語を入力する必要があります。あなたの例では、 "associativeData"の "keys"をすべてループして、キーの名前をStringに渡し、それをgetJSONArray()に渡します。私がそこに着くと、私は私のポストで使った例のようなものです? –

+1

上記の最初の例では、あなたの質問/投稿に書かれているように、JSONデータの形式をほとんど変えていません。唯一の違いは、各単語を手動で使用するのではなく、データをループすることができる 'keys()'オブジェクトを指していることです。 あなたの質問では説明していないことは、最後にデータをどのように使用するかということです。おそらく、構造化してアクセスするためのより簡単な方法がありますか? –

+0

私はすべての単語をヒントとともにWordオブジェクトに入れようと計画しています。このオブジェクトには、単語そのものと、その単語のヒントを含むArrayListが含まれています。コンストラクタは次のようになります: 'public Word(String name、ArrayList ヒント)。私は、必要なデータを得ることができるはずです、正しい? –

1
は小さなステップにダウンあなたの問題をブレーク

使用しています。

ステップ1: JSONのdataオブジェクトにアクセスできますか?

その後、dataオブジェクトを取得するgetJSONObject()を呼び出して、JSONのすべてをロードするためにloadJSONObject()関数を呼び出すことによってこれを行うことができます。

JSONObject JSON = loadJSONObject(「data.json」); JSONObjectデータ= json.getJSONObject( "data"); println(data);

手順2:dataオブジェクト内の3つのフィールドに移動できますか?

処理のJSONObjectを使用して各フィールドをループする標準の、標準の方法はないと思います。だから、あなたがそれらを手動で取得する必要があります:

JSONObject json = loadJSONObject("data.json"); 
JSONObject data = json.getJSONObject("data"); 
JSONArray abase = data.getJSONArray("abase"); 
JSONArray abate = data.getJSONArray("abate"); 
JSONArray abbot = data.getJSONArray("abbot"); 
println(abase); 
println(abate); 
println(abbot); 

ステップ3:を今、あなたはJSONArrayインスタンスを持っていることを、あなたは彼らと何をするかしたいですか?

JSONArrayインスタンスを取得したら、各インスタンスをループしてその内容を1つのArrayListに追加するなど、任意の操作を行うことができます。

フィールド自体にループするコードを記述したい場合は、自分で記述する必要があります。グーグル「Java get json objectのフィールド名」は、大量の結果を返します。

関連する問題