Java Json 读取 hashmap 时遇到问题

标签 java json

我正在尝试读取此 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/

相关文章:

Mysql 5.7 ERROR 3143 (42000) : Invalid JSON path expression. 错误在字符位置3附近

json - 我如何修复 "Error Domain=NSCocoaErrorDomain Code=3840 "无值 ."UserInfo={NSDebugDescription=No value.}"

Java解析字符串

java - 从字节数组中读取 short

java - 判断Json中是否确实存在Gson SerializedName注释的类字段

java - JSON Android 解析数据时出错

java - jackson 根据类型反序列化

java - 在 netbeans 中关闭与 MySQL 的连接

java - 以批处理模式发布 - 将依赖项版本更改为 SNAPSHOTS

java - 检查 csv 文件中的重复行 - java