2013-02-07 16 views
6

Ich habe JSON (siehe unten), ich versuche, den gesamten JSON zu analysieren, und jedes Objekt wird eine neue Instanz einer Klasse sein, die die Variablen unten deklariert. Was ist der beste Weg, dies zu tun? Soll ich einen JSONReader verwenden oder JSONObject und JSONArray verwenden? Ich habe einige Tutorials gelesen und einige allgemeine Fragen gestellt, aber ich habe keine Beispiele gesehen, wie man solche Daten analysieren kann.JSON-Daten mit JSONReader oder JSONObject/JSONArray analysieren

{ 
    "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 
         } 
        ] 
       } 
      ] 
     } 
    ] 
} 

Antwort

2

, wenn ich es täte, werde ich die ganze Zeichenfolge in eine JSONObject analysieren

JSONObject obj = new JSONObject(str); 

dann sehe ich, dass Ihre Unterkategorien ein JSONArray ist. So will ich es konvertieren wie diese

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

damit Sie eine Schleife tun und instanziiert Ihre Klassenobjekt

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

GSON ist der einfachste Weg, wenn Sie mit verschachtelten Objekten arbeiten müssen.

wie folgt aus:

//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; 
} 

Sie dieses Tutorial überprüfen, http://androidsmith.com/2011/07/using-gson-to-parse-json-on-android/ oder http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html oder http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

0

Das Beispiel JSON-Daten Sie auf dem Laufenden scheint nicht die JSON der Datenstruktur zu folgen. Sie müssen Ihre Daten genau so konstruieren, wie es in der dritten von Mustafa geposteten Version link gelehrt wird. Dies ist ein wirklich tolles Tutorial. Ich bin den Schritten gefolgt und es funktioniert wirklich!

8

Sie können JSON-Objekt/JSON-Array nur verwenden, wenn die Größe Ihrer JSON-Daten weniger als 1 MB beträgt. Sonst solltest du mit JSONReader gehen. JSONReader verwendet tatsächlich den Streaming-Ansatz, während JSONObject und JSONArray schließlich alle Daten im RAM laden, was OutOfMemoryException im Falle eines größeren JSON verursacht.

+5

'Sie können mit JSON Objekt/JSON-Array, wenn Die Größe Ihrer JSON-Daten beträgt weniger als 1 MB. Wo ist diese Information offiziell dokumentiert? – AADProgramming

1

dies ist ein einfaches Beispiel für Gson zur Modellierung von Arraylist von Objekten über JsonReader mit:

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()); 
    } 
} 

und das Objekt i modelliert: nur

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"; 
}