【发布时间】:2012-02-08 20:33:20
【问题描述】:
如何忽略json中的父标签??
这是我的json
String str = "{\"parent\": {\"a\":{\"id\": 10, \"name\":\"Foo\"}}}";
这是要从 json 映射的类。
public class RootWrapper {
private List<Foo> foos;
public List<Foo> getFoos() {
return foos;
}
@JsonProperty("a")
public void setFoos(List<Foo> foos) {
this.foos = foos;
}
}
这是测试 公共类 JacksonTest {
@Test
public void wrapRootValue() throws Exception {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);
String str = "{\"parent\": {\"a\":{\"id\": 10, \"name\":\"Foo\"}}}";
RootWrapper root = mapper.readValue(str, RootWrapper.class);
Assert.assertNotNull(root);
}
我得到错误::
org.codehaus.jackson.map.JsonMappingException: Root name 'parent' does not match expected ('RootWrapper') for type [simple type, class MavenProjectGroup.mavenProjectArtifact.RootWrapper]
我找到了Jackson注解给出的解决方案::
(a) Annotate you class as below
@JsonRootName(value = "parent")
public class RootWrapper {
(b) It will only work if and only if ObjectMapper is asked to wrap.
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE, true);
任务完成!!
Jackson 反序列化方式的另一个问题:(
如果“DeserializationConfig.Feature.UNWRAP_ROOT_VALUE 已配置”,它会解开所有 json,尽管我的类没有使用 @JsonRootName(value = "rootTagInJson") 进行注释,但并不奇怪。
只有当类被 @JsonRootName 注释时,我才想解开根标签,否则不要解开。
下面是展开根标签的用例。
###########################################################
Unwrap only if the class is annotated with @JsonRootName.
############################################################
我对 Jackson 源代码的 ObjectMapper 做了一个小改动,并创建了一个新版本的 jar。 1.将此方法放在ObjectMapper中
// Ash:: Wrap json if the class being deserialized, are annotated
// with @JsonRootName else do not wrap.
private boolean hasJsonRootName(JavaType valueType) {
if (valueType.getRawClass() == null)
return false;
Annotation rootAnnotation = valueType.getRawClass().getAnnotation(JsonRootName.class);
return rootAnnotation != null;
}
2. Edit ObjectMapper method ::
Replace
cfg.isEnabled(DeserializationConfig.Feature.UNWRAP_ROOT_VALUE)
with
hasJsonRootName(valueType)
3. Build your jar file and use it.
【问题讨论】:
-
这不是一个真正的问题。我们鼓励您提出自己的问题,但建议您以问答对的形式进行。
-
除了自动包装/解包之外,我发现简单的单属性包装器类可以创造奇迹;或绑定到
Map<String,WrappedType>,然后获取唯一条目的值。 -
我喜欢这个答案!!我只有一个问题?如果我想这样做怎么办: TypeReference ref = new TypeReference
- >() {} );然后在这里做一些解包。我的问题是 JsonRootName 在这里需要“列表”,但我的对象有一些不同。我不知道如何为 ref 变量添加注释?
-
@StaxMan 的建议实际上非常有用,并且当您可能正在编写 JerseyTest 并意识到 @Ash 的解决方案还不是 apache 源代码的一部分时,这是实现目标的最短路径。我花了几分钟才弄清楚如何在 Java 代码中绑定泛型:
myClientResponse.getEntity(new GenericType<Map<String, WrappedType>>(){});