Java Jackson中嵌套JSON对象层次结构的非规范化
假设我有一个JSON对象层次结构,如下所示:Java Jackson中嵌套JSON对象层次结构的非规范化,java,json,jackson,Java,Json,Jackson,假设我有一个JSON对象层次结构,如下所示: { “名称”:“蚊子激光”, “配置”:[{ “货币”:“美元”, “价格”:“10.00”/*基本选项*/ }, { “货币”:“美元”, “价格”:“50.00”/*专业选项*/ }, ] } 我想将这个json反序列化为java对象,并将其扁平化为单个级别。例如,我想将上述json映射到以下java类: @JsonIgnoreProperties(ignoreUnknown=true) 公共类产品{ @JsonProperty 受保护的字符串
{
“名称”:“蚊子激光”,
“配置”:[{
“货币”:“美元”,
“价格”:“10.00”/*基本选项*/
}, {
“货币”:“美元”,
“价格”:“50.00”/*专业选项*/
}, ]
}
我想将这个json反序列化为java对象,并将其扁平化为单个级别。例如,我想将上述json映射到以下java类:
@JsonIgnoreProperties(ignoreUnknown=true)
公共类产品{
@JsonProperty
受保护的字符串名称;
保护串最低价格;
保护串最高价格;
}
我想使用一个自定义方法来计算json中配置列表中的最低价格
和最高价格
字段。为了便于讨论,假设json层次结构和java对象在这里为了清晰起见已经简化,而实际上它们要复杂得多,所以我不希望实现一个完全自定义的反序列化器。我希望使用Jackson的数据绑定默认值自动反序列化大多数字段,但我希望为某些字段指定自定义操作
有没有一种简单的方法可以告诉Jackson使用一种特殊的方法来自动计算最低价格
和最高价格
字段的值 使用:
@JsonProperty("configuration")
@JsonDeserialize(using = ConfigurationDeserializer.class)
protected String cheapestPrice;
反序列化程序如下所示:
public class ConfigurationDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(final JsonParser jsonParser, final DeserializationContext deserializationContext) throws IOException {
(your logic to go from the configuration JSON to cheapestPrice goes here)
}
}
公共类配置反序列化程序扩展JsonDeserializer{
@凌驾
公共字符串反序列化(final JsonParser JsonParser,final DeserializationContext DeserializationContext)引发IOException{
(从配置JSON到最便宜价格的逻辑如下)
}
}
在ETL和SQL中,这是聚合。有几个问题:
- 是否需要聚合这些值
- 您是否需要来自较低级别JSON的其他值
- 记忆是个问题吗
- CPU是个问题吗
- 聚合需要在解析树状结构时保存状态
- 快速流解析程序不保存状态
- 状态可以传递给子级,也可以从子级返回
- Jackson在解析不需要的子值时可能会很慢
或者,在中读取JSON时,定义匹配的setter。方法优先于字段。好的,这是一个很好的解决方案,但是我意识到我有一个额外的约束,我没有意识到这一约束很重要。我实际上需要计算多个计算字段,而不仅仅是一个。我不知道该如何使用这个解决方案,因为计算第一个字段将吞没流解析器中的令牌。我会更新的question@emmby我认为唯一的解决方案是为这两个字段指定一个特定的类。或者在父类上使用Deserializer。虽然此答案可能会为解决OP的问题提供一些见解,但建议包含一些演示答案中概述的概念的代码示例。
public class Product {
public String name;
protected String lowestPrice;
protected String highestPrice;
public int getLowestPrices() {
return calculateLowest(lowestPrice);
}
// and similarly for highestPrice...
}