Как Retrofit 2.0 анализирует вложенный объект JSON?
Наша команда решила использовать Retrofit 2.0, и я делаю некоторые начальные исследования этой библиотеки. Как указано в заголовке, я хочу проанализировать некоторые вложенные объекты JSON через Retrofit 2.0 в нашем приложении для Android.
Например, вот вложенный объект 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
. Я заметил, что есть некоторые сообщения о разборе вложенных объектов JSON через Retrofit 1.X, но последние API Retrofit 2.0 сильно изменились, что сбивает с толку при адаптации их к новым API.
Два возможных решения приходят в голову:
- Напишите мою собственную фабрику JSON конвертеров, которая расширяет Converter.Factory.
- Вернуть необработанный ответ в виде типа String и проанализировать его самостоятельно. Но это не так просто получить сырой ответ от Retrofit 2.0 в соответствии с моими первоначальными исследованиями. Retrofit 2.0, по-видимому, настаивает на преобразовании ответа во что-то, прежде чем передать его мне, и Retrofit не предоставляет своего собственного
StringConverter
. (Я могу ошибаться ~)
Обновление: на самом деле мы можем получить необработанный ответ, установив JSONElement
в качестве pojo для интерфейса HTTP API и используя GSONConverter, предоставленный Retrofit, в качестве конвертера.
Ответы
Ответ 1
Предполагая, что ваш полный 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
}
Ответ 2
Следующий код поможет получить вложенный 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 в 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());
}
});
}
Ответ 3
Используйте 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);
}
Ответ 4
Вы пробовали залп?... я предпочитаю его переоборудовать сейчас, это продукт google. У меня есть рабочий пример, и если вы не возражаете, я могу показать вам.
http://www.androidhive.info/2014/09/android-json-parsing-using-volley/
Ответ 5
Я забыл добавить аннотации @SerializedName
и @Expose
для внутренних объектов Class, а после добавления проблема с аннотациями решена. Как это:
JSON:
{"Id": 1,}
и член класса:
@SerializedName("Id")
@Expose
private int id;
Ответ 6
Используйте это, чтобы создать свой класс http://www.jsonschema2pojo.org