我有以下课程:
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
Expected BEGIN_ARRAY but was STRING at line 1 column 62
但是我不知道为什么,根据jsonlint,json是有效的。
我为什么会收到此错误的任何主意吗?
您的JSON有效-但您的映射类无效(部分不匹配)。特别是,files无法将类的属性映射为Map<String, String>给定JSON中的a。很难推荐一个备用的结构来存储数据而不会看到更大的样本,但是通常,在JSON结构和Java类之间进行映射时,可以遵循本指南。此JSON:
files
Map<String, String>
"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解析为该结构。
CFS