2016-12-07 22 views
1

私はウィキペディアから情報を引き出すために改造を利用しようとしています。 これらは、関連する改造コードでクラスです:レトロフィットは、例外をスローしますが、onRespoでAndroidの改造トラブル

Log.i("RetrofitResponse", mResponse.toString());

does notの

https://github.com/smholsen/whatIsThisThing/blob/master/app/src/main/java/com/simon/whatisthisthing/RetrofitBuilder.java

https://github.com/smholsen/whatIsThisThing/blob/master/app/src/main/java/com/simon/whatisthisthing/WikiInfo.java

https://github.com/smholsen/whatIsThisThing/blob/master/app/src/main/java/com/simon/whatisthisthing/WikiService.java

nseコールバックメソッドは、返されたボディにヌルが含まれていることを示しています。

私がやった間違いはありますか?このURIを表すの正しい方法

interface WikiService { 

    @GET("?format=json&action=query&prop=extracts&exintro=&explaintext=") 
    Call<WikiInfo> search(@Query("titles") String search); 
} 

は、このですか? :https://en.wikipedia.org/w/api.php?&action=query&prop=extracts&exintro=&explaintext=&titles=pizza&format=json

どのように私のWikiInfoオブジェクトフィールドにjsonフィールドをマップする方法がわかっていますか?クラスのフィールドに、jsonレスポンスのキーと同じ名前を付けました。

私はどんな応答にも非常に感謝しています!

ありがとうございます。

お礼

+0

が含まれている - それは、そのGsonに委任する。それに応じてJavaオブジェクトクラスにアノテートする必要があります。 –

+1

あなたはmResponseメソッドを返しています。あなたはコールが非同期であることを理解する必要があります。コールバックを持っていることの全体的なポイントです – njzk2

+0

そうです!ニースキャッチ:)私は理解する。しかし、現在の問題は、受け取ったresponse.body()が私が期待したものを含んでいないということです(受け入れられた答えのコメントを参照)。 –

答えて

2

あなたのポーズについては問題があると思います。ここでは、改造したwikipedia APIからデータを取得するためのpojosの例を示します。メインラッパークラスと呼ばれる結果

public class Result { 
    @SerializedName("batchcomplete") 
    private String result; 
    @SerializedName("query") 
    private Query query; 
} 

クエリクラス::

編集

public class Query { 
    @SerializedName("pages") 
    private Map<String, Page> pages; 

    public Map<String, Page> getPages() { 
     return pages; 
    } 

    public void setPages(Map<String, Page> pages) { 
     this.pages = pages; 
    } 
} 

とページ

public class Page { 
    @SerializedName("pageid") 
    private long id; 
    @SerializedName("title") 
    private String title; 
    @SerializedName("extract") 
    private String content; 
} 

そしてここでは、あなたのサービス・インターフェースです

interface WikiService { 
    @GET("?format=json&action=query&prop=extracts&exintro=&explaintext=") 
    Call<Result> search(@Query("titles") String search); 
} 

基本的にはラッパークラスが必要です。 Page pojoに一致する必要があるWikipediaのjsonレスポンスのラベルを変更することができます。また番号も変更できます。したがって、Retrofitで成功した回答を得るには、Mapと一致する必要があります。

私の例GitHubプロジェクトには、wikipedia apiとretrofitの実装例があります。

https://github.com/savepopulation/wikilight

+1

希望です。私の答えであなたのレポを使用しました。また、OPがRealmObjectsを必要としているとは思わない –

+1

あなたのケースのrealmオブジェクトは不要です。どのようにあなたは私のレポを使うことができます。 – savepopulation

+1

@ cricket_007ローカルデータソースで 'realm.copyFromRealm()'が表示されても、私はまだうんざりしますが、それはOKです。 – EpicPandaForce

2

ので、ここであなたが戻って取得JSONです。

{ 
    "batchcomplete": "", 
    "query": { 
     "normalized": [{ 
      "from": "pizza", 
      "to": "Pizza" 
     }], 
     "pages": { 
      "24768": { 
       "pageid": 24768, 
       "ns": 0, 
       "title": "Pizza", 
       "extract": "Pizza is a yeasted flatbread generally topped with tomato sauce and cheese and baked in an oven. It is commonly topped with a selection of meats, vegetables and condiments. The term was first recorded in the 10th century, in a Latin manuscript from Gaeta in Central Italy. The modern pizza was invented in Naples, Italy, and the dish and its variants have since become popular and common in many areas of the world.\nIn 2009, upon Italy's request, Neapolitan pizza was safeguarded in the European Union as a Traditional Speciality Guaranteed dish. The Associazione Verace Pizza Napoletana (the True Neapolitan Pizza Association) is a non-profit organization founded in 1984 with headquarters in Naples. It promotes and protects the \"true Neapolitan pizza\".\nPizza is sold fresh or frozen, either whole or in portions, and is a common fast food item in Europe and North America. Various types of ovens are used to cook them and many varieties exist. Several similar dishes are prepared from ingredients commonly used in pizza preparation, such as calzone and stromboli." 
      } 
     } 
    } 
} 

ここでは、(切り捨てられた)Javaクラスがあります。

public class WikiInfo { 
    private String name; 
    private String extract; 
} 

Retrofitはここで設定したGsonにJSON処理を委任します。

private Retrofit retrofit = new Retrofit.Builder() 
     .baseUrl(BASE_URL) 
     .addConverterFactory(GsonConverterFactory.create()) 
     .build(); 

それはあなたがそのJSONの外に欲しいものを知ってしようとしている問題を抱えており、それは単にあなたがresponse["query"]["pages"]を望んで知ることができない、そして、ページID #24768、およびそれとは"title""extract"


ので、解決策は、車輪の再発明しないでくださいいずれか

  1. です。 Wikipedia用の妥当なJava APIを見つけたり、既存のRetrofit Wikipediaサンプルが存在するかどうかを確認してください。 (例えば、WikiLightを参照してください)
  2. あなたが持っているものを続けますが、あなたのWikiInfoクラスを適切に実装する方法についていくつかの調査を行います。これを始めるにはGsonのドキュメントを参照してください。しかし、Map<String, Page> pageのオブジェクトは良いスタートになります。その後Page.javaは改造が*私のWikiInfoのオブジェクトフィールドにJSONのフィールドをマップする方法を知ってどのように* private String title, extract;
+0

すばらしい返答をありがとう! 「照会」するオブジェクトの種類はここにありますか?それは2人のarraylistsを含むarraylistでしょうか? (正規化されたページ)? WikiInfoクラスを正しく実装する方法に関する情報がどこにありますか? :) –

+1

私は他の答えはあなたがそれをカバーしていると思います。 –