2017-04-21 10 views
1

に私は次のようなJSONファイルを持っている:レトロフィットGson LinkedTreeMapカスタムオブジェクト

https://www.mediamarkt.de/de/product/productlistajax.json?categoryId=563612&sort=topseller&lazyLoading=true

EDIT:ケースで上記のリンクが機能しない:https://pastebin.com/cTxp1RZ6

今、私がこれまでに発見した唯一の可能性をこのJSONを取得するにはマップを使用しています:

Call<Map<String, Object>> call = liveApi.loadProductList(request.categoryId, request.sort, request.lazyLoading) 

call.enqueue(new Callback<Map<String, Object>>() { 
    @Override 
    public void onResponse(Call<Map<String, Object>> call, Response<Map<String, Object>> response) { 
     Call<Map<String, Object> map = response.body(); 
    } 
}); 

しかし、下位層のすべてのオブジェクトをキーで検索する必要があります。私はこれらのオブジェクトを@SerializedName()というモデルクラスにマップしたいと思います。どうすればいいですか?

+0

上記のリンクは壊れています。 JSON文書を投稿できますか? –

+0

私はそれが私のために働いている2つの異なるネットワークからリンクを試みた。私はそれを貼り付けますsomehwre – 4ndro1d

+0

ちょうど同様にペーストビンのリンクを追加しました – 4ndro1d

答えて

2

カスタムマッピングを作成するだけです。あなたのJSONドキュメントはかなり複雑であるので、あなたは、自動マッピング・ジェネレータを試すことができますが、彼らは何らかの理由(動的特性、多型の値、不適切なcamelCaseNaming検出、など)のために失敗した場合、あなたは常にあなたのカスタムマッピングを作成することができます

final class Response { 

    @SerializedName("categories") final List<Category> categories = null; 
    @SerializedName("facettes") final List<Facet> facettes = null; 
    @SerializedName("productlistentries") final List<Map<String, Product>> productListEntries = null; 
    @SerializedName("last") final boolean isLast = Boolean.valueOf(false); 

} 

final class Category { 

    @SerializedName("amount") final int amount = Integer.valueOf(0); 

} 

final class Facet { 

    // ??? 

} 

final class Product { 

    @SerializedName("name") final String name = null; 
    @SerializedName("modelNumber") final int modelNumber = Integer.valueOf(0); 
    @SerializedName("brandLogo") final String brandLogo = null; 
    @SerializedName("detailLink") final String detailLink = null; 
    @SerializedName("online") final boolean isOnline = Boolean.valueOf(false); 
    @SerializedName("imageURL") final String imageUrl = null; 
    @SerializedName("addToBasketUrl") final String addToBasketUrl = null; 
    @SerializedName("rating") final int rating = Integer.valueOf(0); 
    @SerializedName("ratingCount") final int ratingCount = Integer.valueOf(0); 
    @SerializedName("features") final List<Feature> features = null; 
    @SerializedName("price") final String price = null; 
    @SerializedName("vatLabel") final String vatLabel = null; 
    @SerializedName("fees") final List<Fee> fees = null; 
    @SerializedName("gtm") final Gtm gtm = null; 
    @SerializedName("productComparison") final ProductComparison productComparison = null; 
    @SerializedName("productWishlist") final ProductWishlist productWishlist = null; 
    @SerializedName("clubProduct") final boolean isClubProduct = Boolean.valueOf(false); 
    @SerializedName("onlineOnlyProduct") final boolean isOnlineOnlyProduct = Boolean.valueOf(false); 

} 

final class Feature { 

    @SerializedName("key") final String key = null; 
    @SerializedName("value") final String value = null; 

} 

final class Fee { 

    @SerializedName("value") final String value = null; 
    @SerializedName("dataLayer") final String dataLayer = null; 

} 

final class Gtm { 

    @SerializedName("name") final String name = null; 
    @SerializedName("id") final String id = null; 
    @SerializedName("price") final String price = null; 
    @SerializedName("brand") final String brand = null; 
    @SerializedName("category") final String category = null; 
    @SerializedName("dimension9") final String dimension9 = null; 
    @SerializedName("dimension10") final String dimension10 = null; 

} 

final class ProductComparison { 

    @SerializedName("dataLayer") final String dataLayer = null; 
    @SerializedName("dataUrl") final String dataUrl = null; 
    @SerializedName("text") final String text = null; 
    @SerializedName("additionalClasses") final String additionalClasses = null; 

} 

final class ProductWishlist { 

    @SerializedName("requestUrl") final String requestUrl = null; 
    @SerializedName("text") final String text = null; 

} 

マッピングを手作業で書くのに約15分かかったので、間違いやタイプミスがあるかもしれません。あなたの応答は読み取り専用で、手動で作成して他の場所に送るべきではないと仮定しているので、すべてのフィールドはfinalと宣言されています。プリミティブフィールドに関する1つの発言:0またはfalseを使用すると、Javaコンパイラはコンパイル時の定数をインラインでインライン化できるため、Type.value(...)は、javacがインライン化できないランタイム値だと考えるような不正行為です。 (ゲッターを生成したいかもしれませんが、単純なデータバッグのIMHOフィールドは使いやすく、ノイズを少なくします)。

Call<Map<String, Object>>Call<Response>に変更するだけで済みます。バニラJavaで

例は、レトロフィットではない:

try (final Reader reader = getPackageResourceReader(Q43535942.class, "response.json")) { 
    final Response response = gson.fromJson(reader, Response.class); 
    System.out.println(response.productListEntries.get(1).get("3486143").imageUrl); 
} 

出力:

//picscdn.redblue.de/doi/pixelboxx-mss-70874441/mobile_220_310_png/CRUNCH-GTO-4125 - 最も高い%C3%A4rker-%28Class-D%29

+0

Repsonseクラスは欠けていたものでした – 4ndro1d

関連する問題