我正在尝试读取此 json 文件:
{
"username": "someusername",
"password": "12345678",
"ipAddresses": {
"2015-09-12": "127.0.0.1"
}
}
使用此类来存储信息:
private final class SavedPlayer {
private final String username;
private final String password;
private final HashMap<LocalDate, String> ipAddresses;
private SavedPlayer(
String username, String password,
HashMap<LocalDate, String> ipAddresses
) {
this.username = username;
this.password = password;
this.ipAddresses = ipAddresses;
}
}
这部分代码抛出异常:
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
SavedPlayer savedPlayer = GSON.fromJson(reader, SavedPlayer.class);
这是抛出的异常:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 5 column 17
如何正确读取这个存储的HashMap?
编辑:当我使用 <String, String>
而不是 <LocalDate, String>
时它工作正常
最佳答案
Gson 允许您注册自己的自定义序列化器和反序列化器。这是通过定义两部分来完成的:
Json Serialiers:需要为对象定义自定义序列化 Json 反序列化器:需要为类型定义自定义反序列化 实例创建者:如果无参数构造函数可用或注册了反序列化器,则不需要
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(LocalDate.class, new MyDeserializer());
registerTypeAdapter 调用检查类型适配器是否实现了多个这些接口(interface)并为所有这些接口(interface)注册。
了解更多信息请查看gson-user-guide
以下是如何为 LocalDate 编写自定义反序列化的示例
public class LocalDateJsonDeserializer implements JsonDeserializer<LocalDate> {
public LocalDate deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException {
return new LocalDate(json.getAsJsonPrimitive().getAsString());
}
}
并使用此行创建 GSON。
final static Gson GSON = new GsonBuilder().registerTypeAdapter(LocalDate.class, new LocalDateJsonDeserializer()).setPrettyPrinting().create();
关于Java Json 读取 hashmap 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32542204/