Gson预计BEGIN_ARRAY但在STRING第1栏第62列

我有以下课程:

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

这个代码应该解析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是有效的。

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

您的JSON是有效的 – 但您的映射类不是(它的一部分不匹配)。 特别是,类的files属性不能映射为给定JSON的Map 。 很难推荐用于存储数据的备用结构而不会看到更大的样本,但一般来说,在JSON结构和Java类之间进行映射时,您可以遵循本指南 。 这个JSON:

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

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

 public class CFS { private List> files = new ArrayList>( 4); private List directories = new ArrayList(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解析为它。

Brain已经注意到你有一个对象数组,所以你需要用自己的自定义反序列化器来转换它。

这是一个示例实现:

 public class q16380367 { final class CFS { public HashMap files = new HashMap(); public ArrayList directories = new ArrayList(); } public static void main(String[] args) { new q16380367(); } public q16380367() { String JSON_STRING = "{\"directories\" : [\"folder1\", \"folder1/folder2\"], \"files\" : [{\"folder1\" : \"file.txt\"}, {\"folder1/folder2\" : \"file.cfg\"}]}"; Gson gson = new GsonBuilder().registerTypeAdapter( new TypeToken>() { }.getType(), new CfsDeserializer()).create(); CFS foo = gson.fromJson(JSON_STRING, CFS.class); } private final class CfsDeserializer implements JsonDeserializer> { @Override public HashMap deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { HashMap data = new HashMap(); JsonArray list = json.getAsJsonArray(); for (JsonElement e : list) { Set> entries = e.getAsJsonObject() .entrySet(); for (Entry entry : entries) { data.put(entry.getKey(), entry.getValue().getAsString()); } } return data; } } } 

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

尝试两件事:

  1. 回到最后的工作条件。 (如果使用VCS,则还原)。
  2. 在构建选项中清理项目并重建。 (为我工作。)

我对android很新。 如果犯了错误,请原谅任何错误。 建议欢迎:)