2015-10-05 34 views
21

Nhóm của chúng tôi quyết định sử dụng Retrofit 2.0 và tôi đang thực hiện một số nghiên cứu ban đầu về thư viện này. Như đã nêu trong tiêu đề, tôi muốn phân tích cú pháp một số đối tượng JSON lồng nhau thông qua Retrofit 2.0 trong ứng dụng Android của chúng tôi.Làm cách nào để Retrofit 2.0 phân tích cú pháp đối tượng JSON lồng nhau?

Ví dụ, here là một đối tượng JSON lồng nhau với các định dạng:

{ 
     "title": "Recent Uploads tagged android", 
     "link": "https://www.flickr.com/photos/tags/android/", 
     "description": "", 
     "modified": "2015-10-05T05:30:01Z", 
     "generator": "https://www.flickr.com/", 
     "items": [ 
     { 
      "title": ... 
      "link": ... 
      "media": {"m":"This is the value I want to get:)"} 
      "description": ... 
      "published": ... 
      "author": ... 
      "author_id": ... 
      "tags": ... 
     }, 
     {...}, 
     ... 
     ] 
} 

Tôi quan tâm đến các đối tượng JSON bên items mảng. Tôi nhận thấy có some posts về phân tích cú pháp đối tượng JSON lồng nhau qua Retrofit 1.X, nhưng API Retrofit 2.0 mới nhất đã thay đổi rất nhiều, điều này gây nhầm lẫn khi thích ứng với API mới.

Hai giải pháp khả thi đi vào tâm trí tôi:

  1. Viết nhà máy chuyển đổi JSON của riêng tôi mà kéo dài Converter.Factory.
  2. Trả về phản hồi thô trong một loại Chuỗi và phân tích cú pháp đó theo chính tôi. Nhưng nó không phải dễ dàng để có được phản ứng thô từ Retrofit 2.0 theo nghiên cứu ban đầu của tôi. Retrofit 2.0 dường như nhấn mạnh trong việc chuyển đổi câu trả lời cho một cái gì đó trước khi chuyển nó cho tôi và Retrofit không cung cấp StringConverter riêng của mình. (Tôi có thể sai ~)

Cập nhật: Chúng tôi thực sự có thể nhận được câu trả lời liệu bằng cách thiết lập JSONElement như POJO cho giao diện HTTP API và sử dụng GSONConverter cung cấp bởi Retrofit như bộ chuyển đổi.

Thật tuyệt vời nếu ai đó có thể chia sẻ một số ý tưởng về vấn đề này.

Cảm ơn :)

+1

gì wil được trong mảng mục? Bạn có thể đăng phần đó không? –

+1

@PankajKumar Cập nhật :) – hackjutsu

+1

Tôi đã thêm một câu trả lời tương tự như JSON của bạn. Thử nó. –

Trả lời

21

Giả sử hoàn chỉnh JSON của bạn trông như

{ 
    "title": "Recent Uploads tagged android", 
    "link": "https://www.flickr.com/photos/tags/android/", 
    "description": "", 
    "modified": "2015-10-05T05:30:01Z", 
    "generator": "https://www.flickr.com/", 
    "items": [ 
    { 
     "member1": "memeber value", 
     "member2": "member value" 
    }, 
    { 
     "member1": "memeber value", 
     "member2": "member value" 
    } 
    ] 
} 

Vì vậy, lớp POJO sẽ

public class MainPojo { 
    private String title; 
    private String description; 
    private String link; 
    private String generator; 
    private String modified; 
    private ArrayList<Items> items; 

    // Getters setters 
} 

public class Items { 
    private String member2; 
    private String member1; 

    // Getters setters 
} 

Lưu ý: Đây là giải pháp tương tự cho JSON của bạn. Các thành viên của Items.java có thể được thay đổi nếu JSON có các khóa khác.


Cập nhật cho POJO như JSON mới

public class Items { 
    private String tags; 
    private String author; 
    private String title; 
    private String description; 
    private String link; 
    private String author_id; 
    private String published; 
    private Media media; 

    // Getters and Setters 
} 

public class Media { 
    private String m; 
    // Getters and Setters 
} 
+1

@IgorGanapolsky Xem phần cập nhật. Đó là một mã ví dụ. –

+2

nó đang làm việc để có được yêu cầu, trong trường hợp yêu cầu bài tôi nhận được đối tượng bên trong là null. Bạn có thể giải thích về điều đó không? – Spartan

+0

@Spartan Tôi không nhận được bạn. Tốt hơn nếu bạn hỏi một câu hỏi mới với JSON mà bạn đang gặp phải vấn đề. Không có mối quan hệ với yêu cầu GET/POST với câu trả lời này. –

4

Sử dụng Gson dễ dàng phân tích cú pháp cho mô hình của bạn https://github.com/google/gson

My Helper Phương pháp:

public String toJson(Object object) { 
    return gson.toJson(object); 
} 

public <T> T fromJson(String json, Class<T> classOfT) { 
    return gson.fromJson(json, classOfT); 
} 

public <T> T fromJson(JsonElement jsonElement, Class<T> classOfT) { 
    return gson.fromJson(jsonElement, classOfT); 
} 
+0

Cảm ơn bạn :) Bạn có thể chia sẻ một số ánh sáng về cách viết giao diện Retrofit không? Tôi nên đặt cái gì cho kiểu chung 'T' cho' Gọi httpApimethod (...) 'trong API HTTP? Tôi có nên định nghĩa một lớp với trường 'items' không? – hackjutsu

+0

@Hackjustu, loại generic 'T' sẽ là lớp pojo của bạn cho' json response'. – Tauqir

+0

Vì vậy, tôi nên xác định một lớp Java 'ItemsHolder' nắm giữ một' Danh sách mục'. Sau đó, tôi có thể lấy các trường 'Item' từ trường' ItemsHolder' của 'items'. Tôi có nhớ điều gì không? Cảm ơn :) – hackjutsu

0

Bạn đã thử bóng? ... tôi thích nó hơn trang bị thêm bây giờ đó là một sản phẩm google.I có ví dụ làm việc và nếu u không nhớ tôi có thể chỉ cho bạn. http://www.androidhive.info/2014/09/android-json-parsing-using-volley/

+1

Cảm ơn bạn đã đề xuất :) Trên thực tế, nhóm của chúng tôi quyết định sử dụng Retrofit 2.0 và tôi đang thực hiện một số nghiên cứu ban đầu về thư viện này. – hackjutsu

+2

Bóng chuyền giúp phân tích cú pháp đối tượng JSON như thế nào? –

5

Tiếp theo mã sẽ giúp để có được đối tượng lồng nhau json và mảng

ví dụ: json

{ 
    "similar_product":[ 
     { ..... 
} 
    ], 
    "options":{ 
     "Blouse Length":[ 
      { "value_id":"696556", 
       } 

đầu tiên chúng ta cần phải tạo mô hình lớp, mô hình lớp các mặt hàng tên giống nhau trong mục json chúng tôi có thể sử dụng @SerializedName("for exact json name")

public class Product { 

     public Options options; 

    public void setOptions(Options options) { 
     this.options = options; 
    } 

    public Options getOptions() { 
     return options; 
    } 


    // length... 

    public class Options 
    { 
     @SerializedName("Blouse Length") 
     private ArrayList<BlouseLength> blouseLengths; 


     public void setBlouseLengths(ArrayList<BlouseLength> blouseLengths) { 
      this.blouseLengths = blouseLengths; 
     } 

     public ArrayList<BlouseLength> getBlouseLengths() { 
      return blouseLengths; 
     } 
    } 



    public class BlouseLength { 
     String value_id; 
     public void setValue_id(String value_id) { 
      this.value_id = value_id; 
     } 



     public String getValue_id() { 
      return value_id; 
     } 
    } 

} 

tạo giao diện cho trang bị thêm để có được mục json trong url

// don't need to put values of id in retrofit 

ex:: "/api-mobile_.php?method=getProductById&pid=" 

chỉ cần vượt qua tham số url trong truy vấn nó tự động lấy url

ví dụ:

public interface Retrofit_Api { 

    @FormUrlEncoded 

    @GET("/api-mobile_.php?method=getProductById") 
    Call<Product> responseproduct(@Query("pid") String pid); 


} 

Trong Lớp học chính của bạn

 String pid=editid.getText().toString(); 


     final Retrofit adapter = new Retrofit.Builder() 
       .baseUrl(Product_url) 
       .addConverterFactory(GsonConverterFactory.create()) 
       .build(); 

     //Creating an object of our api interface 
     Retrofit_Api api = adapter.create(Retrofit_Api.class); 


     Call<Product> call = api.responseproduct(pid); 


     call.enqueue(new Callback<Product>() { 
      @Override 
      public void onResponse(Call<Product> call, Response<Product> response) { 


       ArrayList<Product.BlouseLength> p= new ArrayList(response.body().getOptions().getBlouseLengths()); 

Editadapter editadapter=new Editadapter(MainActivity.this,p); 

       recyclerView.setAdapter(editadapter); 


      } 

      @Override 
      public void onFailure(Call<Product> call, Throwable t) { 


       Log.d("Error", t.getMessage()); 
      } 
     }); 



    } 
0

Salam. Tôi quên thêm @SerializedName@Expose chú thích cho các đối tượng Lớp bên trong và sau khi thêm các vấn đề chú thích này được giải quyết. Như thế này:

JSON:

{"Id": 1,} 

và Class thành viên:

@SerializedName("Id") 
@Expose 
private int id; 
Các vấn đề liên quan