使用java的JSON解析器错误:

时间:2015-11-19 10:36:46

标签: java json parsing

我想解析一个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)

有人可以帮助我,我无法找到问题所在,谢谢。

4 个答案:

答案 0 :(得分:2)

问题在于以下几点:

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

答案 1 :(得分:2)

@nogard答案的扩展名中,我检测到文件中的 JSON 文本中有错误,JSON字符串就像 java map javascript对象具有键值对,在您的文件键中定义错误,它应该是双引号(&#34;&#34;)所以键值对看起来像&#34; key&#34;:&#34; value String&#34; &#34; key&#34;:value Number 。有关详细信息,请查看link

修改后你的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文件将解决您的问题。

答案 2 :(得分:1)

如果json不是以#strong>&#34; {&#34; ...开头,那么json就不是json了。这是Exception消息的主要解释。< / p>

重新格式化json文档并重试。

答案 3 :(得分:1)

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

编辑

您发布的JSON内容实际上是正确的(您使用Web实用程序jsonlint验证了很好),因为它定义了一个元素数组。问题出在于使用Java API for JSON。实际上,正如@nogard在他的回答中所示,JSONObject String构造函数期望一些JSON内容而不是文件名。 (见official doc)。所以你的解析器试图将文件名解释为一些JSON内容,因此失败(因为文件名“fichier”是 NOT 一个有效的JSON字符串)。

所以你应该先通过输入流获取文件内容,然后在序列化实用程序的帮助下构建你的JSON对象:

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