2013-02-07 34 views
6

Tôi có một số JSON (được hiển thị bên dưới), tôi đang cố gắng phân tích cú pháp thông qua toàn bộ JSON và mỗi đối tượng sẽ là một thể hiện mới của lớp khai báo các biến bên dưới. Cách tốt nhất để làm việc này là gì? Tôi có nên sử dụng JSONReader hoặc sử dụng JSONObject và JSONArray không. Tôi đã đọc một số hướng dẫn và hỏi một số câu hỏi chung, nhưng tôi đã không thấy bất kỳ ví dụ nào về cách phân tích dữ liệu như thế này.Phân tích dữ liệu JSON bằng cách sử dụng JSONReader hoặc JSONObject/JSONArray

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

Trả lời

2

nếu tôi đã làm điều đó, tôi sẽ phân tích toàn bộ chuỗi để một JSONObject

JSONObject obj = new JSONObject(str); 

thì tôi thấy rằng các danh mục con của bạn là một JSONArray. Vì vậy, tôi sẽ chuyển đổi nó như thế này

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

với điều này bạn có thể làm một vòng lặp và nhanh chóng đối tượng lớp học của bạn

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

GSON là cách dễ nhất khi bạn phải làm việc với các đối tượng lồng nhau.

như thế này:

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

Bạn có thể kiểm tra hướng dẫn này, http://androidsmith.com/2011/07/using-gson-to-parse-json-on-android/ hoặc http://www.javacodegeeks.com/2011/01/android-json-parsing-gson-tutorial.html hoặc http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

0

Ví dụ dữ liệu JSON bạn đăng dường như không làm theo cấu trúc dữ liệu của JSON. Bạn sẽ cần phải xây dựng dữ liệu của bạn chính xác theo cách tương tự như được giảng dạy trong phần thứ ba link được đăng bởi Mustafa. Đây là một hướng dẫn thực sự tuyệt vời. Tôi làm theo các bước và nó thực sự hoạt động!

8

Bạn chỉ có thể sử dụng JSON Object/JSON Array nếu kích thước dữ liệu json của bạn nhỏ hơn 1MB. Khác bạn nên đi với JSONReader. JSONReader thực sự sử dụng phương pháp tiếp cận luồng trong khi JSONObject và JSONArray cuối cùng tải tất cả dữ liệu trên RAM cùng một lúc, điều này gây ra lỗi OutOfMemoryException trong trường hợp json lớn hơn.

+5

'Bạn có thể sử dụng JSON Object/JSON Mảng chỉ khi kích thước dữ liệu json của bạn nhỏ hơn 1MB' Thông tin này được chính thức tài liệu ở đâu? – AADProgramming

1

đây là một ví dụ đơn giản của việc sử dụng Gson cho mô hình ArrayList của đối tượng thông qua JsonReader:

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

và Object i mô hình:

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"; 
} 
Các vấn đề liên quan