java - 使用带有动态字段的 Jackson 注释反序列化 JSON

标签 java json jackson deserialization pojo

我有来自 WebAPI 的以下格式的 json 响应:

{
    "Status": "Successful Request",
    "ErrorCode": 200,
    "ResultCount": 1,
    "Trends": {
        "39381": {
            "user_distance_units": 1,
            "total_sep": 0,
            "max_power": 0,
            "max_rpm": 0,
            "max_heart_rate_bpm": 0,
            "distance": 0,
            "avg_power": 0,
            "avg_rpm": 0,
            "avg_hr": 0,
            "calories": 0,
            "classes": "0",
            "max_avg_power": 0,
            "max_avg_rpm": 0,
            "max_avg_hr": 0
        }
    }
}

我正在尝试将其映射到 POJO。我在使用 Jackson 注释时遇到了一些困难。 39381 是一个客户端 ID,出于某种原因,Web 服务将其与响应一起提供。该客户端 ID 是动态的,并且会随着不同用户的每次调用而变化。在这种情况下,我似乎无法使用 Jackson 注释 @JsonProperty。映射变得更加复杂。由于我确实不需要客户端 ID 信息,所以我真的想跳过它,只需将数据映射到此趋势类:

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({ "user_distance_units", "total_sep", "max_power", "max_rpm", "max_heart_rate_bpm", "distance",
        "avg_power", "avg_rpm", "avg_hr", "calories", "classes", "max_avg_power", "max_avg_rpm", "max_avg_hr" })
public class Trends
{

    @JsonProperty("user_distance_units")
    private Integer userDistanceUnits;
    @JsonProperty("total_sep")
    private Integer totalSep;
    @JsonProperty("max_power")
    private Integer maxPower;
    @JsonProperty("max_rpm")
    private Integer maxRPM;
    @JsonProperty("max_heart_rate_bpm")
    private Integer maxHeartRateBPM;
    @JsonProperty("distance")
    private Integer distance;
    @JsonProperty("avg_power")
    private Integer avgPower;
    @JsonProperty("avg_rpm")
    private Integer avgRPM;
    @JsonProperty("avg_hr")
    private Integer avgHr;
    @JsonProperty("calories")
    private Integer calories;
    @JsonProperty("classes")
    private Integer classes;
    @JsonProperty("max_avg_power")
    private Integer maxAvgPower;
    @JsonProperty("max_avg_rpm")
    private Integer maxAvgRPM;
    @JsonProperty("max_avg_hr")
    private Integer maxAvgHr;
    @JsonIgnore
    private Map<String, Object> additionalProperties = new HashMap<String, Object>();

有办法做到这一点吗?

最佳答案

趋势以以 ClientId 为键的 map 形式返回。 因此,您可以定义一个具有内部趋势图的顶级 Response 对象:

   class Response {
    @JsonProperty("Status")
    private String status;
    @JsonProperty("ErrorCode")
    private  int errorCode;
    @JsonProperty("ResultCount")
    private  int resultCount;
    @JsonProperty("Trends")
    private Map<String, Trends> trends;
   }

如果您不关心 clientId,您可以添加一个 getter,它只是尝试返回映射的第一个元素。

关于java - 使用带有动态字段的 Jackson 注释反序列化 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51585451/

相关文章:

json - 如何在 Go 中解析奇怪的 JSON

java - Gson - 如何使用嵌套 JSON 解析动态 JSON 字符串?

java - 限制 Jackson REST API 的调用

java - 如何在 Jackson 运行时添加变量 JSON 根

java - 如何使用Java获取上传到Amazon S3的文件的进度状态

java - 集合中的递归方法

javascript - WCF 服务接受简单的 JSON 字符串但拒绝带有 400 错误的 JSON 集

java - 基于 Jackson 字段的序列化

c# - 将构建器方法与服务方法相结合 - 不好的做法?

java - DocumentListener 上的 JTable 过滤器不起作用