2015-10-05 6 views
21

Наша команда решила использовать Retrofit 2.0, и я делаю некоторые первоначальные исследования в этой библиотеке. Как указано в названии, я хочу проанализировать некоторые вложенные объекты JSON через Retrofit 2.0 в нашем приложении для Android.Как 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": ... 
     }, 
     {...}, 
     ... 
     ] 
} 

Я заинтересован в объекты JSON внутри items массива. Я замечаю, что есть some posts о разборке вложенных объектов JSON с помощью Retrofit 1.X, но последние API Retrofit 2.0 сильно изменились, что сбивает с толку при адаптации их к новым API.

два возможных решения приходят мне на ум:

  1. Написать свой собственный JSON конвертер завод, который расширяет Converter.Factory.
  2. Возвращает необработанный ответ в строковом типе и разбор его самостоятельно. Но нелегко получить исходный ответ от Retrofit 2.0 в соответствии с моими первоначальными исследованиями. Retrofit 2.0, похоже, настаивает на преобразовании ответа на что-то, прежде чем передать его мне, а Retrofit не предоставит свой собственный StringConverter. (Я мог бы быть неправильно ~)

Update: Мы можем фактически получить сырье ответ, установив JSONElement как POJO для интерфейса API HTTP и использовать 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. Члены Item.java могут быть изменены, если у JSON есть другие ключи.


Обновление для 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

@ Спартан Я тебя не понял. Лучше, если вы зададите новый вопрос с 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

Спасибо :) Можете ли вы рассказать о том, как написать интерфейс для доработки? Что я должен поставить для родового типа 'T' для' Call httpApimethod (...) 'в HTTP API? Должен ли я определять класс с полем 'items'? – hackjutsu

+0

@Hackjustu, общий тип 'T' будет вашим классом pojo для' json response'. – Tauqir

+0

Итак, я должен определить класс Java 'ItemsHolder', который содержит« Список элементов ». Затем я могу получить экземпляры 'Item' из поля' ItemsHolder' 'items'. Я что-то пропустил? Спасибо :) – hackjutsu

0

вы пробовали залп? ... я предпочитаю его переоборудовать сейчас, это продукт google. У меня есть рабочий пример, и если вы не возражаете, я могу показать вам. http://www.androidhive.info/2014/09/android-json-parsing-using-volley/

+1

Спасибо за предложение :) Собственно, наша команда решила использовать Retrofit 2.0, и я делаю некоторые начальные исследования в этой библиотеке. – hackjutsu

+2

Как волейбол помогает разобрать объекты JSON? –

5

После кода поможет получить вложенный объект JSON и массив

, например: JSON

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

сначала нам нужно создать класс модели, имена элементов класса модели одинаковы в json item, мы можем использовать @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 элемент в URL

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

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

просто передать параметр URL-адрес в запросе он автоматически загрузит 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

Salam. Я забыл добавить @SerializedName и @Expose аннотации для внутренних объектов класса и после того, как добавить эти аннотации проблема решена. Как это:

JSON:

{"Id": 1,} 

и класса член:

@SerializedName("Id") 
@Expose 
private int id; 
Смежные вопросы