Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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中将JSON解析为字符串_Java_Json_Parsing - Fatal编程技术网

尝试在Java中将JSON解析为字符串

尝试在Java中将JSON解析为字符串,java,json,parsing,Java,Json,Parsing,我正试图在以下位置解析此股票信息: 这是一个JSON格式的映射,基本上遵循本教程,我看到使用QuickJSON jar,但它一直给我一个异常,我不知道为什么。这是代码,非常感谢您的帮助 教程链接: 以下是我得到的一个例外: Exception in thread "main" com.json.exceptions.JSONParsingException: @Key-Heirarchy::root[0]/ @Key:: COMMA or ] is expected. but found

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

这是一个JSON格式的映射,基本上遵循本教程,我看到使用QuickJSON jar,但它一直给我一个异常,我不知道为什么。这是代码,非常感谢您的帮助

教程链接:

以下是我得到的一个例外:

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

此json不是有效的,有两个“/”


用于验证此来自该URL的响应以
/
开头,这不是有效的JSON:

//[{“id”:“99624”,“t”:“CSCO”,“e”:“NASDAQ”,“l”:“24.00”,“l_cur”:“24.00”,“s”:“2”,“ltt”:“EDT下午4:00”,“lt”:“6月25日,EDT下午4:00”,“c”:“-0.05”,“cp”:“-0.21”,“ccol”:“chr”,“el”:“24.00”,“el_cur 24.00”,“elt”:“6月25日,EDT下午5:54”,“ec”:“0.00”,“ecp”:“0.00”,“eccol”:“chb”,“0.17”,“2.83”]


根据和,Google Finance API已被弃用,因此您可能希望找到其他内容。

除了删除领先的
/
之外,还可以修复您的循环。更改

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

或者,最好使用类似的
StringBuilder

String line = null;
StringBuilder json = new StringBuilder();
while((line = input.readLine()) !=null)
{
    json.append(line);
}
value = json.substring(3); // removes the leading "// "
编辑
我不熟悉你的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);
将此添加到您的代码中:

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

您需要在开始时替换
/
以“清理”JSON,然后才能对其进行解析。

您似乎正在使用旧的quick 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,它前面不应该有
/

// [
[
{
"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字符串结束

我能够在没有
/

// [
[
{
"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}]}

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

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


它告诉您,在例外情况下,输入的一部分没有预期的分隔符。是的,但它的格式是正确的,因此我不知道它为什么会告诉您它不是。看起来您在while循环期间在“value”内每隔2行添加1行readLine()。
/
此处不可解析使用以下几种方法之一“”你可以通过Google找到的网页来验证你的JSON。对,我也用value.substring(3)尝试了它,以“[”开头,但它仍然给我一个错误相同的错误:线程“main”com.JSON.exceptions.JSONParsingException中的异常:“@”Key-heirarch::root[0]/“@”Key::逗号或]是预期的。但发现:…@Position::6从输入中跳过行不是问题吗?抱歉,我已经仔细检查了,感谢您指出了这一点,真不敢相信我仍然时不时地犯这个错误。它现在可以工作,但返回空值。因此它解析不正确,有任何建议您使用哪个JSON解析器吗?快速JSON。根据调试呃,它把所有东西都放在“根”中。我忘了哈希表的一些基本规则吗?是的,问题是你的映射{}在JSON数组[]中。您可能需要进一步探索API,以便在json中实现两个级别。@brendan long如果您检查输入,唯一的情况是在开始时,我相当肯定它不会再次发生。如果您只查看一次输入的特定情况,那么它似乎是安全的,但仍然是过度的,并且不必要地增加了出现错误的风险。这样做会更安全、更有效:
如果(value.startswith(“/”)value=value.substr(2);
@brendan long yea我同意你的观点。我只是为一个特定的问题编写了这个代码。我会编辑它,但我现在在移动设备上。源代码不错。尝试在你的答案中添加相关示例。