web-dev-qa-db-ja.com

Retrofit 2.0はネストされたJSONオブジェクトをどのように解析できますか?

私たちのチームは Retrofit 2. を使用することにし、このライブラリの初期調査を行っています。タイトルで述べたように、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": ...
        },
        {...},
        ...
        ]
}

items配列内のJSONオブジェクトに興味があります。 一部の投稿 Retrofit 1.Xを介したネストされたJSONオブジェクトの解析についてありますが、最新のRetrofit 2.0 APIは大きく変更されており、新しいAPIに適応させると混乱します。

次の2つの解決策が思い浮かびます。

  1. Converter.Factory を拡張する独自のJSONコンバーターファクトリを記述します。
  2. 未加工のレスポンスをString型で返し、自分で解析します。しかし、私の最初の調査によると、Retrofit 2.0から生の応答を得るのは簡単ではありません。 Retrofit 2.0は、応答を何かに変換してからそれを渡すように主張しているようで、Retrofitは独自のStringConverterを提供していません。 (間違っているかもしれません〜)

更新:HTTP APIインターフェースのpojoとしてJSONElementを設定し、Retrofitが提供するGSONConverterをコンバーター。

26
hackjutsu

完全な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のメンバーを変更できます。


新しいJSONとしてのPojoの更新

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
}
33
Pankaj Kumar

次のコードは、ネストされた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;
        }
    }

}
_

uRLでJSONアイテムを取得するためのレトロフィット用のインターフェイスを作成します

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



    }
_
8
lemuriyan

モデルに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
KP_G

内側のClassオブジェクトに@SerializedNameおよび@Expose注釈を追加するのを忘れ、これらの注釈の問題を追加した後、解決しました。このような:

JSON:

{"Id": 1,}

およびクラスメンバー:

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

ボレーを試しましたか? ...私は現在、グーグル製品であるレトロフィットよりもそれを好む。 http://www.androidhive.info/2014/09/Android-json-parsing-using-volley/

0
Goodlife