小编典典

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

java

我有以下课程:

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

而此代码应解析json:

CFS cfs = JStorage.getGson().fromJson(JSON_STRING, CFS.class);

哪里

JSON_STRING = "{\"directories\" : [\"folder1\", \"folder1/folder2\"], \"files\" : [{\"folder1\" : \"file.txt\"}, {\"folder1/folder2\" : \"file.cfg\"}]}"

JSON是:

{
  "directories": ["folder1", "folder1/folder2"],
  "files": [
    {
      "folder1": "file.txt"
    }, 
    {
      "folder1/folder2": "file.cfg"
    }
  ]
}

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

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

我为什么会收到此错误的任何主意吗?


阅读 186

收藏
2020-09-28

共1个答案

小编典典

您的JSON有效-但您的映射类无效(部分不匹配)。特别是,files无法将类的属性映射为Map<String,String>给定JSON中的a。很难推荐一种备用结构来存储数据而又不会看到较大的示例,但是通常在JSON结构与Java类之间进行映射时。此JSON:

"files": [
    {
        "folder1": "file.txt"
    }, 
    {
        "folder1/folder2": "file.cfg"
    }
]

表示包含对象的数组,其中每个对象最好表示为地图。因此,实质上是地图列表。因此,您的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
}

请注意,我已通过将您的属性设为私有并添加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());

产生:

[{folder1=file.txt}, {folder1/folder2=file.cfg}]

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

2020-09-28