2013-02-07 19 views
6

Bazı JSON'um (aşağıda gösterilmiştir), tüm JSON'u ayrıştırmaya çalışıyorum ve her nesne aşağıdaki değişkenleri bildiren bir sınıfın yeni bir örneği olacaktır. Bunu yapmanın en iyi yolu nedir? JSONReader kullanmalı mıyım, JSONObject ve JSONArray kullanmalı mıyım? Bazı öğreticiler okuyordum ve bazı genel sorular soruyordum, ancak bu gibi verileri nasıl ayrıştırılacağına dair hiçbir örnek görmedim.JSONReader veya JSONObject/JSONArray kullanarak JSON verilerini ayrıştırma

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

cevap

2

i JSONObject nesnesi

JSONObject obj = new JSONObject(str); 
için tüm dizeyi ayrıştırmak olacak

daha sonra alt kategorilerinizin bir JSONArray olduğunu görüyorum. Yani ben size sınıf nesnesi Json veri yapısına uygun olması görünmüyor yayınlanmıştır

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

Yuvalanmış nesnelerle çalışmanız gerektiğinde GSON en kolay yoldur. Böyle

: ben bunu yapmak için sanki bu öğretici kontrol edebilirsiniz

//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/ veya http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html veya http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

0

örnek JSON verilerini bir döngü yapmak ve örneğini bu bu

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

gibi dönüştürecektir. Verileri, Mustafa tarafından yayınlanan üçüncü link'da öğretildiği gibi tam olarak aynı şekilde oluşturmanız gerekecektir. Bu gerçekten harika bir öğretici. Adımları takip ettim ve gerçekten işe yarıyor!

8

JSON Nesnesi/JSON Dizisini yalnızca json verilerinizin boyutu 1 MB'den azsa kullanabilirsiniz. Diğerse JSONReader ile gitmelisin. JSONReader aslında akış yaklaşımını kullanırken JSONObject ve JSONArray, bir kerede tüm verileri RAM üzerine yükler, bu da daha büyük json durumunda OutOfMemoryException'a neden olur.

+5

'JSON Nesne/JSON Diziyi sadece kullanabilirsiniz json verilerinizin boyutu 1MB'den azdır. Bu bilgi resmi olarak belgelenmiştir? – AADProgramming

1

bu modelleme JsonReader yoluyla nesnelerin arraylist için GSON kullanmanın basit bir örnek:

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

ve ben modellenmiş Nesne:

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