繁体   English   中英

Java的JSON解析器错误:

[英]JSON parser error with java:

我想解析一个json文件,这是我的代码:

import org.json.JSONArray;
import org.json.JSONObject;

public class principale {


    public static void main(String[] args) {
        // TODO Auto-generated method stub
        String fichier ="C:\\listesanscoord.json";
        JSONObject obj = new JSONObject("fichier");
        String pageName = obj.getJSONObject("pageInfo").getString("pageName");

        JSONArray arr = obj.getJSONArray("oaci");
        for (int i = 0; i < arr.length(); i++)
        {
            String url = arr.getJSONObject(i).getString("url");

        }
    }

}

这是我的json文件: listesanscoord.json我有以下错误:

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)
    at org.json.JSONObject.<init>(JSONObject.java:198)
    at org.json.JSONObject.<init>(JSONObject.java:325)
    at metar.principale.main(principale.java:13)

有人可以帮我吗,我找不到问题所在,谢谢。

问题出在以下几行:

String fichier ="C:\\listesanscoord.json";
JSONObject obj = new JSONObject("fichier");

通常,您应该传递文件的内容,而不仅仅是文件名(或“ fichier”):

InputStream is = JsonParsing.class.getResourceAsStream("C:\\listesanscoord.json");
String jsonTxt = IOUtils.toString( is );
JSONObject json = (JSONObject) JSONSerializer.toJSON( jsonTxt ); 

@nogard答案的扩展名中,我检测到文件中的JSON文本有错误 ,JSON字符串就像java mapjavascript对象具有键值对,在您的文件键中定义错误,它应该用双引号(“” ),因此键值对看起来就像“ key”:“ value String”“ key”:value Number一样 有关更多信息,请参见链接

修改后,您的json将如下所示。

[
    {
        "oaci": "LFXA",
        "aeroport": "Aérodrome d'Ambérieu",
        "url": "https://fr.wikipedia.org/wiki/A%C3%A9rodrome_d%27Amb%C3%A9rieu",
        "commune": "Chateau-Gaillard, Ambronay"
    }
    //more json objects 
]

如果您像上面那样修改json文件,将解决您的问题。

如果您的json并非以“ {”开头这是Exception消息的主要解释),则根本不是json。

重新格式化json文档,然后重试。

异常非常明显(一次!)。 JSON内容必须以{[开头,因为它必须至少定义一个根对象或数组。

编辑

您发布的JSON内容实际上是正确的(可以通过Web实用程序jsonlint进行验证),因为它定义了元素数组。 问题是由Java API用于JSON引起的。 确实,如@nogard在他的答案中所示,JSONObject String构造函数期望一些JSON内容而不是文件名。 (请参阅官方文档 )。 因此,您的解析器尝试将文件名解释为某些JSON内容,从而失败(因为文件名“ fichier不是有效的JSON字符串)。

因此,您应该在例如通过输入流获取文件内容之前,并借助序列化实用程序来构建JSON对象:

String json = IOUtils.toString(JsonParsing.class.getResourceAsStream("C:\\listesanscoord.json"));
JSONObject jsonObj = (JSONObject) JSONSerializer.toJSON( json ); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM