java Jackson自定义反序列化程序删除了反序列化程序方法内部的一些字段

mefy6pfw  于 2023-06-04  发布在  Java
关注(0)|答案(2)|浏览(289)

我有一个JSON对象,需要在我的用例中进行反序列化。此外,我需要生成一些字段值,这些字段值组合了同一JSON中的一个或多个属性。因此,我选择Jackson反序列化,并使用相关的反序列化类注解必需的字段,如下所示

@Getter
@ToString
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product implements Serializable {

    @JsonProperty("item_name")
    @JsonDeserialize(using = ProductDeserializer.ItemName.class)
    private String itemName;
    
    @JsonProperty("item_code")
    @JsonDeserialize(using = CommonDeserializer.Trim.class)
    private String itemCode;
    
    @JsonProperty("demand_status")
    @JsonDeserialize(using = ProductDeserializer.DemandStatus.class)
    private boolean isDemandItem;
    
    @JsonProperty("upc")
    private long upcCode;
    
    @JsonProperty("store_condition") //multiple attributes uses, ex 'store_code'
    @JsonDeserialize(using = ProductDeserializer.StoreConditionDeserializer.class)
    private StoreCondition storeCondition;

    .....

}

storeCondition变量的反序列化类如下:

public static class StoreConditionDeserializer extends JsonDeserializer<StoreCondition> {
    @Override
    public StoreCondition deserialize(JsonParser jp, DeserializationContext context) throws IOException {
        String stock_id = jp.getCodec().readValue(jp, JsonNode.class).asText();
        String store_code = jp.getCodec().readValue(jp, JsonNode.class).get("store_code").asText();
    
        /* I need to access several fields from the JSON to generate the object I need, 
           but some of them are missing here but they exist in the JSON input */
    
        //Also some logic, API calls, etc
    
        return ...;
    }
    
}

这就是我的输入JSON的样子

{
  "_id": 28463836,
  "item_name": "john product",
  "item_code": "doe code",
  "store_code": "T",
  "demand_status": "D",
  "upc": 874564847,
  "store_condition": "F",
  "location": "IR",
  "W_Code": "X3846"
}

如果你看一下Pojo类,最后一个用@JsonProperty("store_condition")注解的属性,它也出现在上面的JSON中。当反序列化发生时,deserialize方法中没有这个完整的JSON对象,它只有store_condition属性之后的属性。但是对于我的用例,我需要访问上面的字段,例如store_code。但由于store_code代码位于store_condition之前,因此store_code在解串器中不可用。
这是我如何进行反序列化的,

ObjectMapper mapper = new ObjectMapper();
Product product = mapper.convertValue(jsonInput, Product.class);

”””有人能解释为什么和如何发生?这也是解决问题的一种方法**
我希望我的问题和要求是清楚的。如果您需要任何澄清,请随时发表评论。
我使用的Jackson库是group: 'org.apache.beam', name: 'beam-sdks-java-extensions-json-jackson', version: '2.47.0'

pobjuy32

pobjuy321#

JsonParser是按顺序获取数据的,当你调用readValue时,它得到F,解析器将光标移动到下一个token,所以没有方法访问前面的store_code字段。所以对于你的场景,我认为你可以为Product类添加自定义的反序列化器,并维护你自己的所有字段,这样你就不会受到解析顺序的影响。

nvbavucw

nvbavucw2#

我找到了一个解决方案,在我们创建ObjectMapper mapper = new ObjectMapper();之后,按以下方式将所需的值传递给它:

ObjectMapper mapper = new ObjectMapper();
DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
DeserializationConfig modifiedConfig = deserializationConfig.withAttribute("mappingData", map);
mapper.setConfig(modifiedConfig);

然后以这种方式通过解串器访问传递的信息,

public com.sysco.site_product.models.pisv2.Split deserialize(JsonParser jp, DeserializationContext context) throws IOException {
      Map<String, Object> inputJSONMap = (Map<String, Object>) context.getAttribute("mappingData");

......

}

开放反馈!

相关问题