gpt4 book ai didi

java - 如何验证我没有收到 @JsonProperty 和 @JsonAlias 中定义的两个值?

转载 作者:行者123 更新时间:2023-12-02 01:44:06 27 4
gpt4 key购买 nike

我正在获取以数字形式显示的子实体child_entity_id。但有时我必须处理 child_entity_selector json 对象,而不是 child_entity_id 。发送它是为了通过数据库中的某些值提取实体。

父实体有这样的注释

@Entity
class Parent {
@Id
long id;

@JsonDeserialize(using = EntityReferenceDeserializer.class)
@JsonSerialize(using = EntityReferenceSerializer.class)
@JsonProperty("child_entity_id")
@JsonAlias("child_entity_selector")
Child child;

对于响应 json,例如

{
"id" : 1,
"child_entity_id": 1,
"child_entity_selector": {
"child_name": "I am a child"
},
}

应该抛出异常,因为只有“child_entity_id”或“child_entity_selector”必须同时出现在一个 json 中。

当我收到这样的 json 时,它会正确解析,但我的反序列化器同时处理 child_entity_idchild_entity_selector 并且最后一个保留在结果中。

目前,我正在尝试获取源 json 和实体,以检查 json 是否没有别名覆盖的重复引用。

我已经设置了 SimpleModule 和自定义反序列化器

@Component
public class WebConfig {

@Bean
public SimpleModule simpleModule() {
SimpleModule module = new SimpleModule();
module.setDeserializerModifier(new BeanDeserializerModifier() {
@Override
public JsonDeserializer<?> modifyDeserializer(DeserializationConfig config, BeanDescription beanDesc, JsonDeserializer<?> deserializer) {
if (beanDesc.getBeanClass() == Child.class)
return new ChildDeserializer(deserializer);
return deserializer;
}
});
return module;
}
}

和解串器

public class ChildDeserializer extends StdDeserializer<Child> implements ResolvableDeserializer {
private final JsonDeserializer<?> defaultDeserializer;

public ChildDeserializer(JsonDeserializer<?> defaultDeserializer) {
super(Child.class);
this.defaultDeserializer = defaultDeserializer;
}

@Override
public Child deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
Child modelExecution = (Child) defaultDeserializer.deserialize(p, ctxt);

// Can not correctly read raw json after parsing -- node becomes null now after deserialization above
JsonNode node = p.getCodec().readTree(p);

boolean duplication = node.has("child_entity_id") && node.has("child_entity_selector");
if (duplication) {
throw new RuntimeException("Duplicated!")
} else {
log("Not duplicated");
}
return child;
}

@Override
public void resolve(DeserializationContext ctxt) throws JsonMappingException {
((ResolvableDeserializer) defaultDeserializer).resolve(ctxt);
}

}

反序列化后我无法访问 JsonNode 值。反之亦然,解析JsonNode值后无法获取反序列化的Child实体。

预期行为

{
"id" : 1,
"child_entity_id": 1,
}

{
"id" : 1,
"child_entity_selector": {
"child_name": "I am a child"
},
}

是正确解析的实体。

但是在两个引用文献中

{
"id" : 1,
"child_entity_id": 1,
"child_entity_selector": {
"child_name": "I am a child"
},
}

应该抛出异常。

最佳答案

您可以在父类中使用@JsonCreator来处理它

    @JsonCreator
public Parent(@JsonProperty("child_entity_id") Child childFromId, @JsonProperty("child_entity_selector") Child childFromSelector) {
if (childFromId != null && childFromSelector != null) {
throw new RuntimeException("Duplicated!");
}

this.child = (childFromSelector == null) ? childFromId : childFromSelector;
}

如果您还需要检查重复字段,则可以使用 JsonParser.Feature.STRICT_DUPLICATE_DETECTION:

{
"id" : 1,
"child_entity_id": 1,
"child_entity_id": 2
}

不幸的是,它不适用于别名

关于java - 如何验证我没有收到 @JsonProperty 和 @JsonAlias 中定义的两个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966956/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com