0

私は、wordpress REST APIを使用してwordpress.comサイトからコンテンツをプルするAndroidリーダーアプリを作成しています。このアプリは、アプリで定義されているArticleオブジェクトに逆シリアル化するJSONオブジェクトを返します。単一の投稿のデータを取得する次のコードは正しく機能します。

    private class getOne extends AsyncTask <Void, Void, JSONObject> {
    private static final String url = "https://public-api.wordpress.com/rest/v1/sites/drewmore4.wordpress.com/posts/slug:good-one";
    @Override
    protected JSONObject doInBackground(Void... params) {
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);
        httpget.addHeader("accept", "application/json");

        HttpResponse response;
        JSONObject object = new JSONObject();
        String resprint = new String();

        try {
            response = httpclient.execute(httpget);
            // Get the response entity
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                // get entity contents and convert it to string
                InputStream instream = entity.getContent();
                String result= convertStreamToString(instream);
                resprint = result;
                // construct a JSON object with result
                object=new JSONObject(result);
                // Closing the input stream will trigger connection release
                instream.close();
            }
        } 
        catch (ClientProtocolException e) {System.out.println("CPE"); e.printStackTrace();} 
        catch (IOException e) {System.out.println("IOE"); e.printStackTrace();} 
        catch (JSONException e) { System.out.println("JSONe"); e.printStackTrace();}

        return object;
    }
    @Override
    protected void onPostExecute (JSONObject object){
        System.out.println("POSTStexxx");
        Gson gson = new Gson();


        Article a = gson.fromJson(object.toString(), Article.class);
        System.out.println("XXCONTENT: " + a.content);

        System.out.println(a.ID);
        System.out.println(a.title);
        System.out.println(a.author.name);
    //  System.out.println(a.attachments.URL);

        WebView wv = (WebView)findViewById(R.id.mainview);

        wv.loadDataWithBaseURL(url, a.content, "text/html", "UTF-8", null);
        wv.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);


    }

}

printlnステートメントは期待される結果を示し、オブジェクトが適切に逆シリアル化されたことを確認します。サイト上のすべての投稿からデータを取得する必要がある次のコードは、正しく機能していません。

private class getAll extends AsyncTask <Void, Void, JSONObject> {
    private static final String url = "https://public-api.wordpress.com/rest/v1/sites/drewmore4.wordpress.com/posts/";
    @Override
    protected JSONObject doInBackground(Void... params) {

         //set up client and prepare request object to accept a json object
        HttpClient httpclient = new DefaultHttpClient();
        HttpGet httpget = new HttpGet(url);
        httpget.addHeader("accept", "application/json");
        JSONObject returned = new JSONObject();
        HttpResponse response;

        String resprint = new String();

        try {
            response = httpclient.execute(httpget);
            // Get the response entity
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                // get entity contents and convert it to string
                InputStream instream = entity.getContent();
                String result= convertStreamToString(instream);
                resprint = result;
                // construct a JSON object with result
                returned =new JSONObject(result);
                // Closing the input stream will trigger connection release
                instream.close();
            }
        } 
        catch (ClientProtocolException e) {System.out.println("CPE"); e.printStackTrace();} 
        catch (IOException e) {System.out.println("IOE"); e.printStackTrace();} 
        catch (JSONException e) { System.out.println("JSONe"); e.printStackTrace();}

       // stories = object;
        return returned;
    }

    @Override
    protected void onPostExecute (JSONObject returned){
        System.out.println("POSTStexxx");
        Gson gson = new Gson();

        PostsHandler ph = gson.fromJson(returned.toString(), PostsHandler.class);

        System.out.println("WAKAWAKA: " +  ph.posts.length);

    //  System.out.println("ARRAYLENGTH" + ja.length());
        ArrayList<Article> arts = new ArrayList<Article>();

        for (JSONObject o : ph.posts) {
            Article a = gson.fromJson(o.toString(), Article.class);
            System.out.println("TITLE: " + a.title);
                            System.out.println("TITLE: " + a.author);
            arts.add(a);
        }
        System.out.println("ARTICLEARRAY: " + arts.size());
        stories = arts;
        populateUI();

    }

ここで返されるJSONオブジェクトには、単一の投稿のクエリによって返されるオブジェクトと同じオブジェクトのJSONArrayが含まれています。プログラムが実行され、ここでのprintlnステートメントの1つは、配列リストのサイズが正しい(つまり、予想される投稿数と一致する)ことを示していますが、各オブジェクト(タイトル、作成者など)のフィールドはnullです。配列を適切に処理していないと思いますが、どこが間違っているのかわかりません。各投稿オブジェクトをマップするArticleクラスは次のとおりです。

public class Article implements Serializable {

//  private static final long serialVersionUID = 1L;
    int ID;
    public String title;
    public String excerpt;
    public Author author;
    public String date;     
    public String URL;

    @SerializedName("featured_image")
    public String image;        
    public String content;
    //public String[] attachments;

    public Attachment attachments;
    public int comment_count;
    public int like_count;


}   


class Author {
long id;
String name;
String URL;
}

そして、すべての投稿のクエリへの応答がマップされるPostsHandlerクラス(および私の問題が疑われる場所):

public class PostsHandler {
    int number;
JSONObject[] posts;

}

@SerializedNameアノテーションが付けられていないすべてのフィールドは、JSONObjectsで使用されているものと同じです。

私が使用しているJSONObjectsは、次の場所で確認できます。

すべての投稿をクエリ

1つの投稿のクエリ

4

1 に答える 1

1

GSONは、情報をシリアル化/逆シリアル化するときに「強い」および「弱い」型付けの概念をサポートします。厳密な型は、明確に定義されたインターフェースを持つ実際のJavaBeanオブジェクトを表します。弱いタイプは、データ(キー/値)ペアのマップを表します。現在、両方のモデルを組み合わせて使用​​しようとしていますが、機能しません。GSONに、データを「強力な」タイプ(PostsHandler)に逆シリアル化するように依頼します。しかし、そのクラス内には、GSONの「弱い」タイプ(JSONObjects)のインスタンスを格納しています。1つの処理モデルを選択(および固定)する必要があります。強力な型を使用してデータを逆シリアル化するとします。

これは私が実装する方法ですPostsHandler

public PostsHandler implements Serializable {
    @SerializedName("found")
    private int number;

    @SerializedName("posts")
    private List<Article> articles

    // Constructors, getters, setters
}

そしてonPostExecute

@Override
protected void onPostExecute (JSONObject returned) {
    Gson gson = new Gson();
    PostsHandler ph = gson.fromJson(returned.toString(), PostsHandler.class);

    System.out.println("Article array length: " + ph.getArticles().size());
    stories = arts;
    populateUI();
}
于 2013-02-25T04:50:41.030 に答える