如何从json忽略parent标记??
这是我的json
String str = "{\"parent\": {\"a\":{\"id\": 10, \"name\":\"Foo\"}}}";
字符串
下面是要从jsonMap的类。
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 root标签的用例。
###########################################################
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.
型
5条答案
按热度按时间bwntbbo31#
从https://github.com/FasterXML/jackson-databind中的
TestRootName.java
中提取的一个例子可能会给予一个更好的方法来做到这一点。具体使用withRootName("")
:字符串
irtuqstp2#
我在Spring中开发一个RESTful应用程序时也遇到过类似的问题。我必须支持一个非常异构的API,其中一些有根元素,另一些没有。我找不到比实时配置此属性更好的解决方案。非常遗憾的是,Jackson中没有对每个类的根元素展开的支持。不管怎样,有人可能会发现这很有帮助。
字符串
eqzww0vc3#
很简单:
创建对象Map器的示例并启用 Package 和解 Package 根值
字符串
将
@JsonRootName("yourname")
注解添加到DTO型
epggiuax4#
作为更新Seagabond的帖子,如果你想在写参数值时有同样的效果,你可以覆盖额外的写方法。
字符串
vwoqyblh5#
我也面临着这种类型的问题。我在配置类中添加了下面的代码行,在这里我定义了RestTemplate及其MessageConverters的配置。
第一个月
基本上,这个配置将帮助Mapper识别所提供的类是否注解了'@ JsonRootName',如果不是,则不需要搜索root。希望它能帮助到你和其他人。