gpt4 book ai didi

java - jackson deearlization : two keys at root. 我如何打开一个并忽略另一个?

转载 作者:搜寻专家 更新时间:2023-11-01 03:37:38 25 4
gpt4 key购买 nike

使用 jackson 2.x

json 响应如下所示:

{
"flag": true,
"important": {
"id": 123,
"email": "foo@foo.com"
}
}

“标志”键不提供任何有用的信息。我想忽略“标志”键并将“重要”值解包到 Important 的实例。

public class Important {

private Integer id;
private String email;

public Important(@JsonProperty("id") Integer id,
@JsonProperty("email") String email) {
this.id = id;
this.email = email;
}

public String getEmail() { this.email }

public Integer getId() { this.id }
}

当我尝试将 @JsonRootName("important") 添加到 Important 并使用 DeserializationFeature.UNWRAP_ROOT_VALUE 配置 ObjectMapper 时,我收到 JsonMappingException:

Root name 'flag' does not match expected ('important') for type ...

当我从 JSON 中删除“标志”键/值时,数据绑定(bind)工作正常。如果我也将 @JsonIgnoreProperties("flag") 添加到 Important,我会得到相同的结果。

更新


更新的类...实际上将通过编译步骤

@JsonRootName("important")
public static class Important {
private Integer id;
private String email;

@JsonCreator
public Important(@JsonProperty("id") Integer id,
@JsonProperty("email") String email) {
this.id = id;
this.email = email;
}

public String getEmail() { return this.email; }

public Integer getId() { return this.id; }
}

实测:

@Test
public void deserializeImportant() throws IOException {
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
om.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
Important important = om.readValue(getClass().getResourceAsStream("/important.json"), Important.class);

assertEquals((Integer)123, important.getId());
assertEquals("foo@foo.com", important.getEmail());
}

结果:

com.fasterxml.jackson.databind.JsonMappingException: Root name 'flag' does not match expected ('important') for type [simple type, class TestImportant$Important]

最佳答案

只是因为 Jackson 中 JSON 解析的流特性,恐怕没有简单的方法来处理这种情况。

在我看来,使用某种包装器更容易。

考虑这段代码:

public static class ImportantWrapper {
@JsonProperty("important")
private Important important;

public Important getImportant() {
return important;
}
}

和实际测试:

@Test
public void deserializeImportant() throws IOException {
ObjectMapper om = new ObjectMapper();
//note: this has to be present
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Important important = om.readValue(getClass().getResourceAsStream("/important.json"), ImportantWrapper.class)
.getImportant();

assertEquals((Integer)123, important.getId());
assertEquals("foo@foo.com", important.getEmail());
}

请注意,@JsonRootName("important") 是多余的,在这种情况下可以将其删除。

这看起来有点丑陋,但只需相对较小的努力即可完美运行。这种“包装器”也可以被泛化,但这更像是架构的东西。

关于java - jackson deearlization : two keys at root. 我如何打开一个并忽略另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25857009/

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