java - Jackson继承——使用@JsonProperty解析子类中的嵌套JSON

标签 java json jackson

我正在尝试使用 Jackson 来解析网络响应。所有回复都遵循这种通用格式:

{
  "status": {
    "code": 0,
    "message": "ok",
    "version": 1
  },
  "data": {
    "accountId": 1111,
    "handle": "mark",
    "stats": {
       "wins": 11,
       "losses": 43
    }
  }
}

“状态”节点在所有对象之间共享,而“数据”节点因响应而异。我的想法是创建一个 NetworkResponse 类来处理解析“状态”节点,然后创建许多继承自 NetworkResponse 的对象来解析我得到的不同 NetworkResponses。

到目前为止,我为基类做了这个:

public class NetworkResponse {
    @JsonProperty("status") protected StatusNode statusNode;

    public NetworkResponse() { }
}

然后是将解析上述网络响应的子类:

public class PlayerInfoResponse extends NetworkResponse {
    @JsonProperty("accountId") private String accountId;
    @JsonProperty("handle") private String handle;
    @JsonProperty("stats") private PlayerStats playerStats;

    public PlayerInfoResponse() {}
}

这里的问题是父类(super class)和子类都不承认“数据”节点。现在,我可以像这样实现子类:

public class PlayerInfoResponse extends NetworkResponse {
    private String accountId;
    private String handle;
    private PlayerStats playerStats;

    @JsonProperty("data") public JsonNode dataNode;
    public void setDataNode(JsonNode dataNode) {
            // parse out data manually 
    }

    public PlayerInfoResponse() {}
}

这行得通,但我想使用@JsonProperty 来保持整洁。无论如何让 jackson 将“数据”节点视为解析时应该使用的节点?这是我用来进行映射的代码:

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
PlayerInfoResponse info = objectMapper.readValue(jsonResponse, PlayerInfoResponse.class);

谢谢!

最佳答案

有几种方法可以解决这个问题。

最简单的方法就是重组您的回复。

public abstract class NetworkResponse {
  @JsonProperty("status") private StatusNode statusNode;
  // getters and setters
}

public class PlayerInfoResponse extends NetworkResponse {
    private PlayerData data;

    public static class PlayerData {
      private String accountId;
      private String handle;
      @JsonProperty("stats") private PlayerStats playerStats;

      // getters and setters
    }
    // getters and setters
 }  

如果您注意到,您的播放器响应对象中有一个未定义的 json 字段数据

此外,@JsonProperty 只允许您重命名 java bean 字段与其对应的 json 字段之间的映射。

关于java - Jackson继承——使用@JsonProperty解析子类中的嵌套JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153739/

相关文章:

java - 如何将添加添加到我们的 Android 应用程序中

json - 更新 Postgresql 中 JSON 字段中的嵌套标记

java - jackson 在第一次关闭大括号后停止读取输入字符串

java - 无法从json文件打印json数组的所有键和值

python - Pandas - 用相应的 id 列值填充缺失的列值

java - 使用 Jackson 反序列化 JSON 时去除空格

java - 动态过滤来自返回域对象列表的 RESTful Web 服务端点的响应中的字段

java - 关闭 Jar 文件后恢复数据

java - SwingX 对 JXFrame 的淡入淡出效果?

java - publicId 和 systemId 之间需要空格