java - 解析来自维基百科的 JSON 响应时遇到问题

标签 java android json gson

所以我正在制作一个 android 应用程序来搜索 mediawiki api 以获取有关某些名人的一小段信息。

想法是你可以输入任何名字,它会提供 mediawiki api 拥有的关于那个名字/人的信息,但现在我只坚持使用一个名字,直到我弄清楚如何正确解析 JSON。

我需要从这个 json 响应中提取字段: JSON response

这就是我目前所拥有的,我认为问题出在 Query 类中,我只是不知道该类需要什么来确保只返回提取字段。当我运行该程序时,onResponse() 方法的输出仅为空。感谢您的帮助。

好的,我按照建议进行了更改,这是我更新后的代码:

;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.StringRequest;
import com.android.volley.toolbox.Volley;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

import java.util.Map;


public class game extends AppCompatActivity {

private static final String ENDPOINT = "https://en.wikipedia.org/w/api.php?    format=json&action=query&prop=extracts&exintro=&explaintext=&titles=Harry%20Potter";

private RequestQueue requestQueue;

private Gson gson;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_game);

    requestQueue = Volley.newRequestQueue(this);

    GsonBuilder gsonBuilder = new GsonBuilder();
    gson = gsonBuilder.create();
}

public void fetchPerson(View view)
{
    fetchPosts();
}
private void fetchPosts() {
    StringRequest request = new StringRequest(Request.Method.GET, ENDPOINT, onPostsLoaded, onPostsError);

    requestQueue.add(request);
}

private final Response.Listener<String> onPostsLoaded = new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        final TextView text = (TextView) findViewById(R.id.textView);

        Page page = gson.fromJson(response, Page.class);

        text.setText(page.extract);

    }
};

private final Response.ErrorListener onPostsError = new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        Log.e("PostActivity", error.toString());
    }
};
public class Root {
    String batchcomplete;
    Query  query;
}
public class Query {
    Map<String, Page> pages;
}
public class Page {
    int    pageid;
    int    ns;
    String title;
    String extract;
}

最佳答案

I think the problem is within the Query class

你是对的。

JSON 数据如下所示:

{
  "batchcomplete": "",
  "query": {
    "pages": {
      "23140032": {
        "pageid": 23140032,
        "ns": 0,
        "title": "Frodo Baggins",
        "extract": "Frodo Baggins is a fictional character in J. R. R. Tolkien's legendarium, and the main protagonist of The Lord of the Rings. Frodo is a hobbit of the Shire who inherits the One Ring from his cousin Bilbo Baggins and undertakes the quest to destroy it in the fires of Mount Doom. He is also mentioned in Tolkien's posthumously published works, The Silmarillion and Unfinished Tales."
      }
    }
  }
}

根对象有 2 个字段:batchcompletequery

您尝试解析具有以下字段的对象:extracttitle

你看到那里的差异了吗?

如果你想使用 Gson,你需要所有对象的类。

class Root {
    String batchcomplete;
    Query  query;
}
class Query {
    Map<String, Page> pages;
}
class Page {
    int    pageid;
    int    ns;
    String title;
    String extract;
}

更新

您需要将 JSON 解析为 Root 对象。

示例代码:

String json = "{\n" +
              "  \"batchcomplete\": \"\",\n" +
              "  \"query\": {\n" +
              "    \"pages\": {\n" +
              "      \"23140032\": {\n" +
              "        \"pageid\": 23140032,\n" +
              "        \"ns\": 0,\n" +
              "        \"title\": \"Frodo Baggins\",\n" +
              "        \"extract\": \"Frodo Baggins is a fictional character in J. R. R. Tolkien's legendarium, and the main protagonist of The Lord of the Rings. Frodo is a hobbit of the Shire who inherits the One Ring from his cousin Bilbo Baggins and undertakes the quest to destroy it in the fires of Mount Doom. He is also mentioned in Tolkien's posthumously published works, The Silmarillion and Unfinished Tales.\"\n" +
              "      }\n" +
              "    }\n" +
              "  }\n" +
              "}";
Root root = new Gson().fromJson(json, Root.class);
for (Page page : root.query.pages.values()) {
    System.out.println(page.title);
    System.out.println("  " + page.extract);
}

输出

Frodo Baggins
  Frodo Baggins is a fictional character in J. R. R. Tolkien's legendarium, and the main protagonist of The Lord of the Rings. Frodo is a hobbit of the Shire who inherits the One Ring from his cousin Bilbo Baggins and undertakes the quest to destroy it in the fires of Mount Doom. He is also mentioned in Tolkien's posthumously published works, The Silmarillion and Unfinished Tales.

关于java - 解析来自维基百科的 JSON 响应时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454838/

相关文章:

java - Mapper 和 Reducer 是 Hadoop 版本 2 中的接口(interface)吗?

android - 我的蓝牙连接只读取零

javascript - 如何获取对象列表并创建列表中对象的特定属性的 JSON?

java - JSON for Java,编码 JSON 数组 - 流

Java 获取然后从列表中删除

java - 未填写所有 Spring 表单字段并收到错误请求错误 400

java - python和java的sha1加密结果不同

android - 如何模糊android中主布局的背景图像?

android - 如何通过正确的 Crashlytics 错误分组获得更好的 RxJava 堆栈跟踪

Javascript 将参数传递给回调函数