【问题标题】:org.json.JSONException: A JSONArray text must start with '['org.json.JSONException:JSONArray 文本必须以“[”开头
【发布时间】:2015-02-15 12:46:58
【问题描述】:

我有以下 json 文件:

[   { "1" : "b1.png"},
    { "2" : "bb1.png"},
    { "3" : "bbg1.png"}
]

并在以下行中:

JSONArray array = new JSONArray(jsonFilePath);

我得到以下异常:

org.json.JSONException: A JSONArray text must start with '[' at 1 [character 2 line 1]
    at org.json.JSONTokener.syntaxError(JSONTokener.java:433)
    at org.json.JSONArray.<init>(JSONArray.java:105)
    at org.json.JSONArray.<init>(JSONArray.java:144)
    at il.ac.technion.cs234311.dolphins.parse.ParseCardsTest.initialize(ParseCardsTest.java:23)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

但它是以'['开头的!!!

有什么想法吗? 非常感谢!

【问题讨论】:

  • jsonFilePath 是文件的路径吗?它应该是 JSON 字符串。
  • 是的,它是文件的路径。我需要先获取 JsonObject,然后将其转换为 jsonArray?
  • jsonFilePath(必须是 JSON 字符串) 可以为空。在调用 JSONArray 之前打印出来。
  • 您需要先读取文件,然后使用该字符串。
  • 它有效!将其发布为答案.. 非常感谢!

标签: java json


【解决方案1】:

创建JSONTokener

Reader in = new InputStreamReader(new FileInputStream(jsonFilePath), StandardCharsets.UTF_8);
JSONArray array = new JSONArray(new JSONTokener(in));
in.close();

您还需要处理FileNotFoundException

【讨论】:

  • JSONTokener 是否关闭输入流?如果没有,您需要自己处理。此外,请注意 FileReader 的字符集问题。它始终使用平台默认编码,可能与 UTF-8 不兼容。见stackoverflow.com/a/696641/611819
【解决方案2】:

正如@JaredRummler 所建议的,您需要先将文件的内容读入一个字符串,然后将该字符串传递给 JSONArray 构造函数。下面是一些使用Apache Commons IO 读取文件的示例代码:


import org.apache.commons.io.IOUtils;

...

public static String readJsonFile(String filename) throws IOException {
    try (InputStream is = new FileInputStream(filename)) {
        return IOUtils.toString(is, StandardCharsets.UTF_8);
    }    
}

....

JSONArray array = new JSONArray(readJsonFile(jsonFilePath));

【讨论】:

  • August 使用 JSONTokener 的答案可能更有效,因为它不需要一次将整个文件读入内存。
猜你喜欢
  • 2017-06-06
  • 2021-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 1970-01-01
  • 2016-01-15
相关资源
最近更新 更多