我有一个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'
2条答案
按热度按时间pobjuy321#
JsonParser是按顺序获取数据的,当你调用readValue时,它得到
F
,解析器将光标移动到下一个token,所以没有方法访问前面的store_code字段。所以对于你的场景,我认为你可以为Product
类添加自定义的反序列化器,并维护你自己的所有字段,这样你就不会受到解析顺序的影响。nvbavucw2#
我找到了一个解决方案,在我们创建
ObjectMapper mapper = new ObjectMapper();
之后,按以下方式将所需的值传递给它:然后以这种方式通过解串器访问传递的信息,
开放反馈!