使用带动态字段的 Jackson 注释反序列化 JSON
Deserialize JSON using Jackson annotations with dynamic field
我收到来自 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 信息,所以我真的很想跳过它,只将数据映射到这个趋势 class:
@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>();
有办法吗?
趋势被return编辑为以 ClientId 为关键字的地图。
因此,您可以使用内部趋势图定义顶级 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,它只是尝试 return 地图的第一个元素。
我收到来自 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 信息,所以我真的很想跳过它,只将数据映射到这个趋势 class:
@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>();
有办法吗?
趋势被return编辑为以 ClientId 为关键字的地图。 因此,您可以使用内部趋势图定义顶级 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,它只是尝试 return 地图的第一个元素。