【问题标题】:Trying to parse JSON to String in Java试图在 Java 中将 JSON 解析为字符串
【发布时间】:2013-06-25 22:14:16
【问题描述】:

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

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) 从 [ 开始,但它仍然给我一个错误

【问题讨论】:

  • 它在异常情况下告诉您输入的部分没有预期的分隔符。
  • 是的,但据我所知它的格式正确,所以我不知道为什么它告诉它不是
  • 在 while 循环期间,您似乎在“value”内每 2 个 readLine() 添加 1 行。
  • // 在这里无法解析
  • 使用您可以通过 Google 找到的多个“Online JSON parser”网页之一来验证您的 JSON。

标签: java json parsing


【解决方案1】:

除了删除前导 // 之外,还要修复您的循环。改变

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

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

或者,最好使用StringBuilder 之类的

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);

【讨论】:

  • 从输入中跳行不是问题吗?
  • 对不起,我完全看过了,感谢您指出这一点,不敢相信我仍然不时犯这个错误。它现在可以工作,但它返回 null。所以它没有正确解析,任何建议
  • 您使用的是哪个 JSON 解析器?
  • 快速 json。根据调试器,它将所有内容都放在“root”中。我是否忘记了哈希表的一些基本规则?
  • 是的,问题是您的 Map {} 在 JSON 数组 [] 中。您可能需要更多地探索 API 以将两个级别降低到您的 json 中。
【解决方案2】:

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

使用http://jsonlint.com/ 进行验证

【讨论】:

    【解决方案3】:

    来自该 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 无论如何都已被弃用,因此您可能需要查找其他内容。

    【讨论】:

    • 对,我也试过用 value.substring(3) 从“[”开始,但它仍然给我一个错误
    • 同一个:线程“main”com.json.exceptions.JSONParsingException 中的异常:“@”Key-Heirarchy::root[0]/“@”Key:: COMMA 或] 是预期的。但发现:...@Position::6
    【解决方案4】:

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

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

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

    【讨论】:

    • 不错的来源。尝试在此处的答案中添加相关示例。
    【解决方案5】:

    将此添加到您的代码中:

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

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

    【讨论】:

    • @brendan long 如果您检查输入,唯一的出现是在开头,我相当肯定它不会再次发生。
    • 如果你看一下输入的特殊情况,那么它似乎是安全的,但它仍然是矫枉过正,并且不必要地增加了错误的风险。这样做会更安全更有效率:if(value.startswith("//")) value = value.substr(2);.
    • @brendan long 是的,我同意你的看法。只是针对特定问题对此进行了编码。我会编辑它,但我现在在移动设备上。
    【解决方案6】:

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

    quick-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}]}
    

    【讨论】:

      猜你喜欢
      • 2012-08-06
      • 1970-01-01
      • 2011-03-14
      • 2020-09-28
      • 1970-01-01
      • 2020-07-31
      • 1970-01-01
      相关资源
      最近更新 更多