我有以下课程:
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是有效的。
我为什么会收到此错误?
答案 0 :(得分:4)
如果有人在AndroidStudio中遇到此错误:
尝试两件事:
我刚接触android。如果犯了错,请原谅。 欢迎提出建议:)
答案 1 :(得分:3)
您的JSON是有效的 - 但您的映射类不是(它的一部分不匹配)。特别是,您的类的files
属性无法从给定的JSON映射为Map<String, String>
。很难推荐用于存储数据的备用结构而不会看到更大的样本,但一般来说,在JSON结构和Java类之间进行映射时,您可以遵循this guide。这个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解析为该结构。
答案 2 :(得分:2)
Brain已经注意到你有一系列对象,所以你需要用自己的deserializer来自己转换它。
以下是一个示例实现:
public class q16380367 {
final class CFS {
public HashMap<String, String> files = new HashMap<String, String>();
public ArrayList<String> directories = new ArrayList<String>();
}
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<HashMap<String, String>>() {
}.getType(), new CfsDeserializer()).create();
CFS foo = gson.fromJson(JSON_STRING, CFS.class);
}
private final class CfsDeserializer implements
JsonDeserializer<HashMap<String, String>> {
@Override
public HashMap<String, String> deserialize(JsonElement json,
Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
HashMap<String, String> data = new HashMap<String, String>();
JsonArray list = json.getAsJsonArray();
for (JsonElement e : list) {
Set<Entry<String, JsonElement>> entries = e.getAsJsonObject()
.entrySet();
for (Entry<String, JsonElement> entry : entries) {
data.put(entry.getKey(), entry.getValue().getAsString());
}
}
return data;
}
}
}