Java Jackson中嵌套JSON对象层次结构的非规范化

Java Jackson中嵌套JSON对象层次结构的非规范化,java,json,jackson,Java,Json,Jackson,假设我有一个JSON对象层次结构,如下所示: { “名称”:“蚊子激光”, “配置”:[{ “货币”:“美元”, “价格”:“10.00”/*基本选项*/ }, { “货币”:“美元”, “价格”:“50.00”/*专业选项*/ }, ] } 我想将这个json反序列化为java对象,并将其扁平化为单个级别。例如,我想将上述json映射到以下java类: @JsonIgnoreProperties(ignoreUnknown=true) 公共类产品{ @JsonProperty 受保护的字符串

假设我有一个JSON对象层次结构,如下所示:

{
“名称”:“蚊子激光”,
“配置”:[{
“货币”:“美元”,
“价格”:“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在解析不需要的子值时可能会很慢

如果只需要修改值,只需定义getter方法即可:


或者,在中读取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...
}