Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解析来自Wikipedia的JSON响应时遇到问题_Java_Android_Json_Gson - Fatal编程技术网

Java 解析来自Wikipedia的JSON响应时遇到问题

Java 解析来自Wikipedia的JSON响应时遇到问题,java,android,json,gson,Java,Android,Json,Gson,因此,我正在制作一个android应用程序,它可以搜索mediawiki api以获取有关某些名人的简短信息 我们的想法是,您可以输入任何名称,它将提供mediawiki api关于该名称/人员的信息,但目前我只使用一个名称,直到我找到正确解析JSON的方法 我需要这个json响应的extract字段: 这就是我目前遇到的问题,我认为问题出在查询类中,我只是不知道该类需要什么来确保只返回extract字段。当我运行程序时,onResponse()方法的输出就是null。谢谢你的帮助 好的,我做

因此,我正在制作一个android应用程序,它可以搜索mediawiki api以获取有关某些名人的简短信息

我们的想法是,您可以输入任何名称,它将提供mediawiki api关于该名称/人员的信息,但目前我只使用一个名称,直到我找到正确解析JSON的方法

我需要这个json响应的extract字段:

这就是我目前遇到的问题,我认为问题出在查询类中,我只是不知道该类需要什么来确保只返回extract字段。当我运行程序时,onResponse()方法的输出就是null。谢谢你的帮助

好的,我做了建议的更改,这是我的更新代码:

;

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;
}
;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.TextView;
导入com.android.volley.Request;
导入com.android.volley.RequestQueue;
导入com.android.volley.Response;
导入com.android.volley.VolleyError;
导入com.android.volley.toolbox.StringRequest;
导入com.android.volley.toolbox.volley;
导入com.google.gson.gson;
导入com.google.gson.GsonBuilder;
导入java.util.Map;
公共类游戏扩展应用程序活动{
私有静态最终字符串终结点=”https://en.wikipedia.org/w/api.php?    format=json&action=query&prop=extracts&exintro=&explaintext=&titles=Harry%20Potter”;
私有请求队列请求队列;
私人Gson;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_游戏);
requestQueue=Volley.newRequestQueue(this);
GsonBuilder GsonBuilder=新的GsonBuilder();
gson=gsonBuilder.create();
}
公众人物(视图)
{
fetchPosts();
}
private void fetchPosts(){
StringRequest=新的StringRequest(request.Method.GET,ENDPOINT,onPostsLoaded,onPostsError);
添加(请求);
}
private final Response.Listener onPostsLoaded=new Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
最终文本视图文本=(文本视图)findViewById(R.id.TextView);
Page=gson.fromJson(响应,Page.class);
text.setText(page.extract);
}
};
private final Response.ErrorListener onPostsError=新响应.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.e(“PostActivity”,error.toString());
}
};
公共类根{
字符串批处理完成;
查询;
}
公共类查询{
地图页;
}
公共类页面{
int pageid;
int-ns;
字符串标题;
字符串提取;
}
}

我认为问题出在
查询
类中

你说得对

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."
      }
    }
  }
}
根对象有两个字段:
batchcomplete
query

您尝试使用以下字段解析对象:
extract
title

你看到不一致的地方了吗

如果要使用Gson,则需要为所有对象创建类

类根目录{
字符串批处理完成;
查询;
}
类查询{
地图页;
}
类页{
int pageid;
int-ns;
字符串标题;
字符串提取;
}

更新

您需要将JSON解析到
根对象中

示例代码:

String json=“{\n”+
“batchcomplete\:\”\,\n”+
“\”查询\“:{\n”+
“\“pages\”:{\n”+
“\“23140032\”:{\n”+
“\“pageid\”:23140032\n”+
“\'ns\':0\n”+
“\'title\:\'Frodo Baggins\”,\n”+
“\“摘录\”:\”佛罗多·巴金斯是J.R.R.托尔金传说中的虚构人物,也是《指环王》的主要主人公。佛罗多是夏尔的霍比特人,他从表兄比尔博·巴金斯那里继承了一枚戒指,并致力于在厄运山的大火中摧毁它。托尔金死后出版的作品《西游记》中也提到了他无数未完成的故事。\“\n”+
“}\n”+
“}\n”+
“}\n”+
"}";
Root=new Gson().fromJson(json,Root.class);
for(第页:root.query.pages.values()){
System.out.println(第页标题);
System.out.println(“+page.extract”);
}
输出

弗罗多·巴金斯 佛罗多·巴金斯是J.R.R.托尔金的传奇故事中的一个虚构人物,也是《指环王》的主要主人公。佛罗多是夏尔的霍比特人,他从表兄比尔博·巴金斯那里继承了这枚戒指,并承担了在厄运山大火中摧毁它的任务。托尔金死后出版的作品《西尔马里奥和未完成的故事》中也提到了他。
什么不起作用?发布您的日志。代码完全可以工作,日志中没有错误,问题是JSON数据中的每个对象都没有类。我做了Andreas建议的更改,也更新了上面的代码,但是我仍然没有做正确的事情,onResponse的输出仍然是空的,谢谢你的澄清!我添加了您建议的类,这是否意味着在onResponse方法中,我应该像这样获取提取字符串
public void onResponse(String response){final TextView TextView=(TextView)findViewById(R.id.TextView);Page Page=gson.fromJson(response,Page.class);TextView.setText(Page.extract);}
,因为我运行了这个程序,在做了这些更改后它仍然以null输出。你肯定是对的,我只是觉得我还是做错了什么。输出不再是空的,而是空的