【问题标题】:Gson parsing of multiple arrays with unknown fieldsGson解析具有未知字段的多个数组
【发布时间】:2018-07-17 11:42:09
【问题描述】:

我的目标是解析以下结构的 JSON 响应

{
"request":{"timestamp":1531826474,"version":1.1},
"Server1":["player1", "player2", "player3"],
"Server2:"["player1", "player2", "player3"],
[...]
}

通过镜像类结构并使用自定义反序列化器来遍历键并删除请求部分,因为在这种情况下我不需要它。服务器和玩家名称未知,数量各不相同。

public class WynnWorld {

    private List<String> players;

    public WynnWorld(List<String> players) {
        this.players = players;
    }

    public List<String> getPlayers() {
        return players;
    }

    public void setPlayers(List<String> players) {
        this.players = players;
    }
}

以前列表包含在一个单独的类中,但希望使用 Gson 的数组映射已放弃。

反序列化器:

public class JSONDeserializer implements JsonDeserializer<List<WynnWorld>> {

    @Override
    public List<WynnWorld> deserialize(JsonElement element, Type type, JsonDeserializationContext context) throws JsonParseException {

        JsonObject jsonObject = element.getAsJsonObject();
        jsonObject.remove("request");
        System.out.println(jsonObject);

        List<WynnWorld> list = new ArrayList<>();

        for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            System.out.println("Parsing: "+entry.getValue());
            list.add(context.deserialize(entry.getValue(), WynnWorld.class));
        }

        return list;
    }

}

过去几个小时我一直在切换类型、添加/删除类但无济于事,当前版本运行 Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $ 尽管提供了一个列表。很明显,我的尝试都缺乏某种理解,因此将不胜感激。

解析尝试:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(WynnWorld.class, new JSONDeserializer());
Gson gson = builder.setFieldNamingPolicy(LOWER_CASE_WITH_UNDERSCORES).create();
List<WynnWorld> response = gson.fromJson(returnString.toString(), new TypeToken<List<WynnWorld>>(){}.getType());

【问题讨论】:

    标签: java json parsing gson


    【解决方案1】:

    Wynworld 是一个包含列表的对象。你尝试解析一个数组。解析结果不能自动赋值给 Wynworld 对象。

    试试类似的方法

        for (Map.Entry<String, JsonElement> entry : jsonObject.entrySet()) {
            Type listType = new TypeToken<List<String>>() {}.getType();
            List<String> players = context.deserialize(entry.getValue(), listType);
            WynnWorld wynnWorld = new WynnWorld(players);
            list.add(wynnWorld);
        }
    

    【讨论】:

    • 有点搞砸了,但它似乎仍然遇到同样的错误。奇怪的是,它似乎甚至没有调用反序列化器,因为测试打印被忽略,可能是设置 TypeToken 会导致一些问题。
    • 这似乎是因为您为 WynnWorld 而不是为 List 注册了 JSONDeserializer。试试这个: GsonBuilder builder = new GsonBuilder();类型类型 = new TypeToken>() {}.getType(); builder.registerTypeAdapter(type, new JSONDeserializer());
    • Used List 代替了令牌,但它就像一个魅力。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多