6

我有以下课程:

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 是有效的。

知道为什么我会收到此错误吗?

4

3 回答 3

8

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

尝试两件事:

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

我对android还很陌生。如果犯了任何错误,请原谅。欢迎提出建议:)

于 2018-09-23T23:32:11.437 回答
4

您的 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 解析到其中。

于 2013-05-05T10:53:19.930 回答
2

正如 Brain 已经指出的那样,您有一个对象数组,因此您需要使用自定义反序列化器自行转换它。

这是一个示例实现:

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;
        }
    }
}
于 2013-05-05T09:48:25.267 回答