2013-02-07 18 views
6

私はいくつかのJSON(下に示しています)を持っています。JSON全体を解析しようとしており、各オブジェクトは以下の変数を宣言するクラスの新しいインスタンスになります。これを行う最善の方法は何ですか? JSONReaderを使用するか、JSONObjectとJSONArrayを使用する必要があります。いくつかのチュートリアルを読んで、いくつかの一般的な質問をしてきましたが、このようなデータを解析する方法の例は見当たりません。JSONReaderまたはJSONObject/JSONArrayを使用してJSONデータを解析します。

{ 
    "id": 356, 
    "hassubcategories": true, 
    "subcategories": [ 
     { 
      "id": 3808, 
      "CategoryName": "Current Products", 
      "CategoryImage": null, 
      "hassubcategories": true, 
      "subcategories": [ 
       { 
        "id": 4106, 
        "CategoryName": "Architectural", 
        "CategoryImage": "2637", 
        "hassubcategories": true, 
        "subcategories": [ 
         { 
          "id": 391, 
          "CategoryName": "Flooring", 
          "CategoryImage": "2745", 
          "hassubcategories": false 
         } 
        ] 
       } 
      ] 
     }, 
     { 
      "id": 3809, 
      "CategoryName": "Non-Current Products", 
      "CategoryImage": null, 
      "hassubcategories": true, 
      "subcategories": [ 
       { 
        "id": 4107, 
        "CategoryName": "Desk", 
        "CategoryImage": "2638", 
        "hassubcategories": true, 
        "subcategories": [ 
         { 
          "id": 392, 
          "CategoryName": "Wood", 
          "CategoryImage": "2746", 
          "hassubcategories": false 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

答えて

2

は、私はJSONObject

JSONObject obj = new JSONObject(str); 
に文字列全体を解析します

あなたのサブカテゴリがJSONArrayであることがわかりました。だから私は、あなたのクラスオブジェクトあなたはJSONのデータ構造に従っていないようだ投稿

for(int i = 0; i < arr.length; i++) 
JSONObject temp = arr.getJSONObject(i); 
Category c = new Category(); 
c.setId(temp.get("id")); 
4

GSONは、ネストされたオブジェクトを操作する必要があるときに最も簡単な方法です。このような

:私はそれを行うにした場合は、このチュートリアルを確認することができます

//after the fetched Json: 
Gson gson = new Gson(); 

Event[] events = gson.fromJson(yourJson, Event[].class); 

//somewhere nested in the class: 
static class Event{ 
    int id; 
    String categoryName; 
    String categoryImage; 
    boolean hassubcategories; 
    ArrayList<Event> subcategories; 
} 

http://androidsmith.com/2011/07/using-gson-to-parse-json-on-android/またはhttp://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.htmlまたはhttp://www.androidhive.info/2012/01/android-json-parsing-tutorial/

0

例JSONデータをループを行うと、インスタンス化することができますこれで、この

JSONArray arr = new JSONArray(obj.get("subcategories")); 

のようにそれを変換します。 Mustafaが投稿した3番目のlinkで教えられているのとまったく同じ方法でデータを構築する必要があります。これは本当に素晴らしいチュートリアルです。私はその手順に従って、それは実際に動作します!

8

JSONオブジェクト/ JSON配列は、jsonデータのサイズが1MB未満の場合にのみ使用できます。そうでなければ、JSONReaderを使うべきです。 JSONReaderは実際にストリーミングアプローチを使用しますが、JSONObjectとJSONArrayは最終的にRAM上のすべてのデータを一度にロードし、大きなJSONの場合にOutOfMemoryExceptionを発生させます。

+5

'あなたがいる場合にのみJSONオブジェクト/ JSON配列を使用することができますあなたのjsonデータのサイズは1MB未満ですこの情報は正式に文書化されていますか? – AADProgramming

1

これはJsonReaderを経由して、オブジェクトのモデリングのArrayListのためのGsonを使用した簡単な例です:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv = (TextView) findViewById(R.id.textviewtest); 
    Task task = new Task(); 
    task.execute(); 
} 

private class Task extends AsyncTask<Void, Void, ArrayList<Flower>> { 

    @Override 
    protected ArrayList<Flower> doInBackground(Void... params) { 

     ArrayList<Flower> arrayFlowers = new ArrayList<Flower>(); 
     Flower[] f = null; 
     try { 
      String uri = "http://services.hanselandpetal.com/feeds/flowers.json"; 
      URL url = new URL(uri); 
      HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
      Gson gson = new Gson(); 

      JsonReader reader = new JsonReader(new InputStreamReader(con.getInputStream())); 
      f = gson.fromJson(reader, Flower[].class); 

      for (Flower flower : f) { 
       arrayFlowers.add(flower); 
      } 
     } catch (MalformedURLException e) { 
      return null; 
     } catch (IOException e) { 
      return null; 
     } 
     return arrayFlowers; 
    } 
    @Override 
    protected void onPostExecute(ArrayList<Flower> result) { 
     StringBuilder sb = new StringBuilder(); 
     for (Flower flower : result) { 
      sb.append(flower.toString()); 
     } 
     tv.setText(sb.toString()); 
    } 
} 

と私は、モデル化オブジェクト:

public class Flower { 

private String category; 
private double price; 
private String instructions; 
private String photo; 
private String name; 
private int productId; 

public String getCategory() { 
    return category; 
} 
public void setCategory(String category) { 
    this.category = category; 
} 
public double getPrice() { 
    return price; 
} 
public void setPrice(double price) { 
    this.price = price; 
} 
public String getInstructions() { 
    return instructions; 
} 
public void setInstructions(String instructions) { 
    this.instructions = instructions; 
} 
public String getPhoto() { 
    return photo; 
} 
public void setPhoto(String photo) { 
    this.photo = photo; 
} 
public String getName() { 
    return name; 
} 
public void setName(String name) { 
    this.name = name; 
} 
public int getProductId() { 
    return productId; 
} 
public void setProductId(int productId) { 
    this.productId = productId; 
} 
@Override 
public String toString() { 
    return getProductId() + " : " + name + "\n" + price + "$" + "\n" + "\n"; 
} 
関連する問題