2015-10-05 121 views
21

我們的團隊決定使用Retrofit 2.0,我正在對此庫進行一些初步研究。正如標題所述,我想通過我們的Android應用程序中的Retrofit 2.0解析一些嵌套的JSON對象。Retrofit 2.0如何解析嵌套的JSON對象?

例如,here是嵌套JSON對象的格式:

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

我感興趣的內部items陣列的JSON對象。我注意到有關於通過Retrofit 1.X解析嵌套JSON對象的some posts,但是最新的Retrofit 2.0 API已經發生了很大的變化,這在將它們適配到新的API時令人困惑。

兩個可能的解決方案進入我的腦海:

  1. 寫我自己的JSON轉換器廠延伸Converter.Factory
  2. 返回String類型的原始響應並自行解析。根據我的初步研究,從Retrofit 2.0獲得原始響應並不容易。 Retrofit 2.0似乎堅持在將響應轉換爲某種東西之前將其傳遞給我,並且Retrofit不提供它自己的StringConverter。 (我可能是錯的〜)

更新:事實上,我們可以得到通過設置JSONElement作爲POJO的HTTP API接口,並使用GSONConverter被改造爲轉換器提供的原始響應。

如果有人能就這個問題分享一些想法,那將是非常好的。

謝謝:)

+1

西港島線是什麼項目陣列?你可以發佈那部分嗎? –

+1

@PankajKumar更新:) – hackjutsu

+1

我添加了一個類似於您的JSON的答案。嘗試一下。 –

回答

21

假設你完整的JSON看起來像

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

所以POJO類是

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 
} 

注:這是您的JSON類似的解決方案。如果JSON具有其他密鑰,則可以更改Items.java的成員。


更新POJO的新JSON

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查看更新部分。這是一個示例代碼。 –

+2

它正在爲獲取請求工作,在發佈請求的情況下,我正在將內部對象作爲null。你能解釋一下嗎? – Spartan

+0

@Spartan我沒有得到你。更好的是,如果您使用您正在面臨問題的JSON提出新問題。這個答案與GET/POST請求沒有關係。 –

4

使用GSON容易解析爲您的模型https://github.com/google/gson

我的輔助方法:

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

謝謝:)你可以分享一下如何編寫Retrofit界面?我應該在HTTP API中爲'調用 httpApimethod(...)'提供通用類型'T'?我應該用字段「items」來定義一個類嗎? – hackjutsu

+0

@Hackjustu,泛型類型'T'將成爲'json response'的pojo類。 – Tauqir

+0

所以,我應該定義一個Java類'ItemsHolder',它包含一個'List items'。然後我可以從'ItemsHolder'的字段'items'中獲得'Item'實例。我想念什麼?感謝:) – hackjutsu

5

下面的代碼將有助於獲得例如嵌套的JSON對象和數組

:JSON

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

首先我們需要創建模型類,模型類項目名稱在json項中是相同的,我們可以使用@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; 
     } 
    } 

} 

創造更新接口中的網址,獲取JSON項目

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

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

只是通過URL參數查詢,它會自動獲取網址

例如:

public interface Retrofit_Api { 

    @FormUrlEncoded 

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


} 

在您的主類

 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

薩拉姆。 我忘了爲內部Class對象添加@SerializedName@Expose註解,並在添加這些註解問題後解決。 像這樣:

JSON:

{"Id": 1,} 

和類成員:

@SerializedName("Id") 
@Expose 
private int id;