gpt4 book ai didi

java - gson 对象与 json 之间的转换导致异常

转载 作者:行者123 更新时间:2023-12-01 17:54:09 25 4
gpt4 key购买 nike

Gson gson = new Gson();

Type type = new TypeToken<HashMap<Rule, HashSet<Data>>>() {
}.getType();

String json = gson.toJson(dailyListSave, type);

HashMap<Rule, HashSet<Data>> list = gson.fromJson(json, type);

上面代码的最后一行导致异常

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 3 path $.

不知道为什么?非常感谢您的帮助。

最佳答案

我知道出了什么问题。

  1. 当将 HashMap 与复杂的 Key 类一起使用时,如上面所示案例规则类。你需要启用在 gson 对象上启用ComplexMapKeySerialization()。
  2. 列表项数据类是抽象类。当使用抽象类时序列化/反序列化您需要注册自定义类型适配器。

这里是代码片段

        GsonBuilder gsonBuilder = new GsonBuilder();
gsonBuilder.registerTypeAdapter(Data.class, new DataJsonAdapter());
gsonBuilder.enableComplexMapKeySerialization();
gson mGson = gsonBuilder.create();

这是 DataJsonAdaptor 类实现

重要的是在序列化期间设置具体的类名并在反序列化期间使用它。类名存储在“type”中

public class DataJsonAdapter implements JsonSerializer<Data>, JsonDeserializer<Data> {
@Override
public JsonElement serialize(Data src, Type typeOfSrc, JsonSerializationContext context) {
JsonObject result = new JsonObject();
result.add("type", new JsonPrimitive(src.getClass().getSimpleName()));
result.add("properties", context.serialize(src, src.getClass()));
return result;
}

@Override
public Data deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
String type = jsonObject.get("type").getAsString();
JsonElement element = jsonObject.get("properties");
try {
return context.deserialize(element,
Class.forName("com.package.name" + type));
} catch (ClassNotFoundException cnfe) {
throw new JsonParseException("Unknown element type: " + type, cnfe);
}
}
}

关于java - gson 对象与 json 之间的转换导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60748069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com