Gson预期为BEGIN_ARRAY,但在第1行第62列处为STRING

Lia*_*ter 5 java arrays json gson

我有以下课程:

final class CFS {
    public Map<String, String> files = new HashMap<String, String>();
    public List<String> directories = new ArrayList<String>();
}
Run Code Online (Sandbox Code Playgroud)

这段代码应该解析json:

CFS cfs = JStorage.getGson().fromJson(JSON_STRING, CFS.class);
Run Code Online (Sandbox Code Playgroud)

哪里

JSON_STRING = "{\"directories\" : [\"folder1\", \"folder1/folder2\"], \"files\" : [{\"folder1\" : \"file.txt\"}, {\"folder1/folder2\" : \"file.cfg\"}]}"
Run Code Online (Sandbox Code Playgroud)

JSON是:

{
  "directories": ["folder1", "folder1/folder2"],
  "files": [
    {
      "folder1": "file.txt"
    }, 
    {
      "folder1/folder2": "file.cfg"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是: Expected BEGIN_ARRAY but was STRING at line 1 column 62

但是我不知道为什么,根据jsonlint,json是有效的。

我为什么会收到此错误的任何想法吗?

Man*_*ane 6

如果有人在AndroidStudio中遇到此错误:

尝试两件事:

  1. 回滚到上一个工作条件。(如果使用VCS,请还原)。
  2. 在生成选项中,清理项目并重新生成。(为我工作。)

我是android新手。如果犯了错,请原谅。欢迎提出建议:)


Per*_*ion 4

您的 JSON 有效 - 但您的映射类无效(部分内容不匹配)。特别是,files类的属性无法Map<String, String>从给定的 JSON 映射为 a。在没有看到更大样本的情况下,很难推荐用于存储数据的替代结构,但一般来说,在 JSON 结构和 Java 类之间映射时可以遵循本指南。这个 JSON:

"files": [
    {
        "folder1": "file.txt"
    }, 
    {
        "folder1/folder2": "file.cfg"
    }
]
Run Code Online (Sandbox Code Playgroud)

表示包含对象的数组,其中每个对象最好表示为映射。所以本质上是一个地图列表。因此,您的 Java 对象应该是:

public class CFS {
    private List<Map<String, String>> files = new ArrayList<Map<String, String>>(
            4);
    private List<String> directories = new ArrayList<String>(4);

    // Constructors, setters/getters
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已通过将属性设为私有并添加 getter/setter 来更正您的属性。使用上面定义的类,您的程序应该可以正常工作。

final Gson gson = new GsonBuilder().create();
final CFS results = gson.fromJson(json, CFS.class);
Assert.assertNotNull(results);
Assert.assertNotNull(results.getFiles());
System.out.println(results.getFiles());
Run Code Online (Sandbox Code Playgroud)

生产:

[{folder1=file.txt}, {folder1/folder2=file.cfg}]
Run Code Online (Sandbox Code Playgroud)

如果您发现自己需要保留当前CFS结构,则需要手动将 JSON 解析到其中。