3

我正在尝试在以下位置解析此股票信息:

http://www.google.com/finance/info?client=ig&q=csco

那是地图的 JSON 格式,基本上按照我看到的使用 quick-json jar 的本教程进行操作,但它一直给我一个异常,我不知道为什么。这是代码,非常感谢任何帮助

教程链接:https ://code.google.com/p/quick-json/

public static void main(String args[]) throws IOException
{
    String value="";
    URL uri = new URL("http://www.google.com/finance/info?client=ig&q=csco");
    BufferedReader input = new BufferedReader(new InputStreamReader(uri.openStream(), "UTF-8"));
    while(input.readLine()!=null)
    {
        value+=input.readLine();
    }
    JsonParserFactory factory = JsonParserFactory.getInstance();
    JSONParser parse = factory.newJsonParser();
    Map jsonData =parse.parseJson(value);
    System.out.println((String)jsonData.get("e"));
}

这是我得到的例外:

Exception in thread "main" com.json.exceptions.JSONParsingException: @Key-Heirarchy::root[0]/   @Key::  COMMA or ] is expected. but found :...@Position::5
    at com.json.utils.JSONUtility.handleFailure(JSONUtility.java:124)
    at com.json.parsers.JSONParser.stringLiteralTemplate(JSONParser.java:574)
    at com.json.parsers.JSONParser.nonValidatingValueTemplate(JSONParser.java:698)
    at com.json.parsers.JSONParser.jsonArrayTemplate(JSONParser.java:454)
    at com.json.parsers.JSONParser.parseJson(JSONParser.java:170)
    at parser.Scratch.main(Scratch.java:27)

编辑:我也试过 Map jsonData =parse.parseJson(value.substring(3) 从 [ 但它仍然给我一个错误

4

6 回答 6

4

除了删除领先的//修复你的循环。改变

while(input.readLine()!=null) // skipping odd lines
{
    value+=input.readLine(); // reading even lines
}

String line = null;
while((line = input.readLine()) !=null)
{
    value +=line;
}

或者,最好使用StringBuilderlike

String line = null;
StringBuilder json = new StringBuilder();
while((line = input.readLine()) !=null)
{
    json.append(line);
}
value = json.substring(3); // removes the leading "// "

编辑
我不熟悉您的 JSON 解析器。使用org.json。Java解析器你可以这样做。

JSONArray jsonRoot = new JSONArray(value);
JSONObject quote = jsonRoot.get(0);
System.out.println ("e = " + quote.getString("e"));

但是,作为一种解决方法,您可以将其剥离[]StringBuilder

// removes the leading "// [" and trailing "]"
value = json.substring(4, json.length() - 1);
于 2013-06-25T22:25:34.997 回答
1

此 json 无效,有两个“//”。

使用http://jsonlint.com/来验证这一点

于 2013-06-25T22:21:06.150 回答
1

该 URL 的响应以 开头//,这不是有效的 JSON:

// [ {“id”:“99624”,“t”:“CSCO”,“e”:“纳斯达克”,“l”:“24.00”,“l_cur”:“24.00”,“s”:“2 ","ltt":"4:00PM EDT","lt":"Jun 25, 4:00PM EDT","c":"-0.05","cp":"-0.21","ccol":" chr","el":"24.00","el_cur":"24.00","elt":"美国东部时间 6 月 25 日下午 5:54","ec":"0.00","ecp":"0.00"," eccol”:“chb”,“div”:“0.17”,“yld”:“2.83”}]

根据thisthis,Google Finance API 无论如何都已弃用,因此您可能想找到其他东西。

于 2013-06-25T22:21:27.600 回答
1

以下博客有足够数量的关于快速 json 解析器的非常好的示例

它也有其他有竞争力的解析器示例

http://codesnippets4all.com/html/parsers/json/quick-json.htm

于 2014-07-17T08:29:32.140 回答
0

将此添加到您的代码中:

    String line = null;
    while((line = input.readLine()) !=null)
    {
        value += line;
    }
    value = value.replace("// ", "");

您需要先替换//开头的 以“清理”JSON,然后才能解析它。

于 2013-06-25T22:32:02.143 回答
-1

看来您正在使用旧的快速 json 解析器版本。使用最新版本进行解析

快速json-1.0.2.3.jar

我可以看到 json 如下所示,

// [
{
"id": "99624"
,"t" : "CSCO"
,"e" : "NASDAQ"
,"l" : "25.41"
,"l_cur" : "25.41"
,"s": "2"
,"ltt":"3:59PM EDT"
,"lt" : "Jul 10, 3:59PM EDT"
,"c" : "+0.25"
,"cp" : "1.01"
,"ccol" : "chg"
,"el": "25.55"
,"el_cur": "25.55"
,"elt" : "Jul 10, 7:07PM EDT"
,"ec" : "+0.14"
,"ecp" : "0.55"
,"eccol" : "chg"
,"div" : "0.17"
,"yld" : "2.68"
}
]

这不是有效的 JSON,它不应该在前面//

// [

删除//并从[json 字符串的末尾开始使用

我能够成功解析下面的json字符串//

[
{
"id": "99624"
,"t" : "CSCO"
,"e" : "NASDAQ"
,"l" : "25.41"
,"l_cur" : "25.41"
,"s": "2"
,"ltt":"3:59PM EDT"
,"lt" : "Jul 10, 3:59PM EDT"
,"c" : "+0.25"
,"cp" : "1.01"
,"ccol" : "chg"
,"el": "25.55"
,"el_cur": "25.55"
,"elt" : "Jul 10, 7:07PM EDT"
,"ec" : "+0.14"
,"ecp" : "0.55"
,"eccol" : "chg"
,"div" : "0.17"
,"yld" : "2.68"
}
]

下面是我得到的版本quick-json-1.0.2.3.jar的输出

{root=[{e=NASDAQ, c=+0.25, div=0.17, l=25.41, lt=Jul 10, 3:59PM EDT, ec=+0.14, ltt=3:59PM EDT, elt=Jul 10, 7:07PM EDT, id=99624, yld=2.68, el_cur=25.55, t=CSCO, cp=1.01, s=2, el=25.55, l_cur=25.41, eccol=chg, ccol=chg, ecp=0.55}]}
于 2013-07-11T03:34:28.817 回答