Java 无法从url解析JSON

Java 无法从url解析JSON,java,json,jakarta-ee,jackson,gson,Java,Json,Jakarta Ee,Jackson,Gson,编写一段代码,查询返回JSON的URL,并可以解析JSON字符串以提取信息片段。应该解析并返回的信息是pageid和“请参阅”链接列表。这些链接应该被格式化为一个人可以用来找到合适文章的实际链接。 使用WikipediaAPI进行查询。示例查询是: 通过更改查询字符串的“标题”部分,可以生成其他查询。解析JSON和提取“请参阅”链接的代码应该足够通用,可以用于任何维基百科文章 我尝试编写以下代码: import java.io.BufferedReader; import java.i

编写一段代码,查询返回JSON的URL,并可以解析JSON字符串以提取信息片段。应该解析并返回的信息是pageid和“请参阅”链接列表。这些链接应该被格式化为一个人可以用来找到合适文章的实际链接。 使用WikipediaAPI进行查询。示例查询是:

通过更改查询字符串的“标题”部分,可以生成其他查询。解析JSON和提取“请参阅”链接的代码应该足够通用,可以用于任何维基百科文章

我尝试编写以下代码:

    import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;

import org.json.JSONException;
import org.json.JSONObject;

public class JsonRead {

    private static String readUrl(String urlString) throws Exception {
        BufferedReader reader = null;
        try {
            URL url = new URL(urlString);
            reader = new BufferedReader(new InputStreamReader(url.openStream()));
            StringBuffer buffer = new StringBuffer();
            int read;
            char[] chars = new char[1024];

            while ((read = reader.read(chars)) != -1)
                buffer.append(chars, 0, read); 

            return buffer.toString();
        } finally {
            if (reader != null)
                reader.close();
        }
    }

      public static void main(String[] args) throws IOException, JSONException {
          JSONObject json;
        try {
            json = new JSONObject(readUrl("https://en.wikipedia.org/w/api.php?format=json&action=query&titles=SMALL&prop=revisions&rvprop=content"));
            System.out.println(json.toString());
            System.out.println(json.get("pageid"));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


          }
}
我在eclipse中使用了下面链接中的json jar:

当我运行上面的代码时,我得到了下面的错误

org.json.JSONException: JSONObject["pageid"] not found.
at org.json.JSONObject.get(JSONObject.java:471)
at JsonRead.main(JsonRead.java:35)
如何从url中提取pageid的详细信息以及“请参阅”链接? 我以前从未使用过JSON,因此请告诉我如何在这里继续

json:

    {  
   "batchcomplete":"",
   "query":{  
      "pages":{  
         "1808130":{  
            "pageid":1808130,
            "ns":0,
            "title":"SMALL",
            "revisions":[  
               {  
                  "contentformat":"text/x-wiki",
                  "contentmodel":"wikitext",
                  "*":"{{About|the ALGOL-like programming language|the scripting language formerly named Small|Pawn (scripting language)}}\n\n'''SMALL''', Small Machine Algol Like Language, is a [[computer programming|programming]] [[programming language|language]] developed by Dr. [[Nevil Brownlee]] of [[Auckland University]].\n\n==History==\nThe aim of the language was to enable people to write [[ALGOL]]-like code that ran on a small machine.  It also included the '''string''' type for easier text manipulation.\n\nSMALL was used extensively from about 1980 to 1985 at [[Auckland University]] as a programming teaching aid, and for some internal projects.  Originally written to run on a [[Burroughs Corporation]] B6700 [[Main frame]] in [[Fortran]] IV, subsequently rewritten in SMALL and ported to a DEC [[PDP-10]] Architecture (on the [[Operating System]] [[TOPS-10]]) and IBM S360 Architecture (on the Operating System VM/[[Conversational Monitor System|CMS]]).\n\nAbout 1985, SMALL had some [[Object-oriented programming|object-oriented]] features added to handle structures (that were missing from the early language), and to formalise file manipulation operations.\n\n==See also==\n*[[ALGOL]]\n*[[Lua (programming language)]]\n*[[Squirrel (programming language)]]\n\n==References==\n*[http://www.caida.org/home/seniorstaff/nevil.xml Nevil Brownlee]\n\n[[Category:Algol programming language family]]\n[[Category:Systems programming languages]]\n[[Category:Procedural programming languages]]\n[[Category:Object-oriented programming languages]]\n[[Category:Programming languages created in the 1980s]]"
               }
            ]
         }
      }
   }
}

如果您仔细阅读您的
异常
,您将自己找到解决方案

Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
您的
异常
说明
JSONObject文本必须以“{”
开头,这意味着您从
api
收到的json可能不正确


因此,我建议您调试代码,并尝试找出字符串变量
jsonText

中实际接收到的内容。如果仔细阅读
异常
,您将找到自己的解决方案

Exception in thread "main" org.json.JSONException: A JSONObject text must begin with '{' at 1 [character 2 line 1]
at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
您的
异常
说明
JSONObject文本必须以“{”
开头,这意味着您从
api
收到的json可能不正确


因此,我建议您调试代码,并尝试找出在字符串变量
jsonText

中实际收到的内容,您会得到异常
org.json.JSONException:JSONObject[“pageid”]未找到。
调用
json.get(“pageid”)时
因为
pageid
不是根的直接子元素。您必须一直向下遍历对象图:

int pid = json.getJSONObject("query")
        .getJSONObject("pages")
        .getJSONObject("1808130")
        .getInt("pageid");
如果你有一个
数组
,你甚至需要迭代数组元素(或者选择你想要的一个)

编辑以下是获取包含“请参见”值的字段的代码

String s = json.getJSONObject("query")
        .getJSONObject("pages")
        .getJSONObject("1808130")
        .getJSONArray("revisions")
        .getJSONObject(0)
        .getString("*");

生成的字符串不包含有效的JSON。您必须手动解析它。

您会得到异常
org.JSON.JSONException:JSONObject[“pageid”]未找到。
调用
JSON.get(“pageid”)时
因为
pageid
不是根的直接子元素。您必须一直向下遍历对象图:

int pid = json.getJSONObject("query")
        .getJSONObject("pages")
        .getJSONObject("1808130")
        .getInt("pageid");
如果你有一个
数组
,你甚至需要迭代数组元素(或者选择你想要的一个)

编辑以下是获取包含“请参见”值的字段的代码

String s = json.getJSONObject("query")
        .getJSONObject("pages")
        .getJSONObject("1808130")
        .getJSONArray("revisions")
        .getJSONObject(0)
        .getString("*");


生成的字符串不包含有效的JSON。您必须手动对其进行分析。

是否调试应用程序?并尝试获取字符串变量“jsonText”实际包含的内容。.尝试在
字符串jsonText=readAll(rd);
之后打印出
jsonText
,因为错误显示字符串不是以开头的{,那么你看到了什么问题了吗?我试着调试它,发现jsonText是空的,但不知道这里的问题是什么?那么另一段代码肯定有问题。请调试整个代码,然后自己发现了错误。不确定为什么要添加Gson或Jackson标记,因为你没有使用这些标记。你调试应用程序了吗?并尝试获取字符串变量“jsonText”实际包含的内容。尝试在
String jsonText=readAll(rd);
之后打印出
jsonText
,因为错误显示字符串不是以{,所以你看到了什么问题了吗?我试着调试它,发现jsonText是空的,但不知道这里的问题是什么?那么另一段代码肯定有问题。请调试整个代码,然后自己发现了错误。我不确定你为什么要添加Gson或Jackson标记,因为你没有使用它们。我无法接收到错误从URL,你能不能建议一下为什么会发生这种情况,因为相同的代码可以很好地用于其他ursl?我想你的
URL
可能有问题,它要么没有收到很好的输入数据,要么因此可能引发任何异常。或者可能会发生更多的事情。不能确切地说@user2077648我已经调试过了我编辑了我的代码,现在数据已被提取,但我仍然无法解析它,我无法从URL接收字符串,请您说明为什么会发生这种情况,因为相同的代码适用于其他ursl??我认为您的
URL
可能存在问题,它既不能获得良好的输入数据,也可能引发任何异常由于这个原因。或者可能会发生更多的事情。不能确切地说@user2077648我已经调试了我的代码,现在获取了数据,但我仍然无法解析它,是的,你是对的,但是对于这个json,我如何才能找到See ALS值?是的,你是对的,但是对于这个json,我如何才能找到See ALS值??