与阵列反序列化杰克逊问题和对象
问题描述:
我运行到一个问题,即我的JSON响应可以是一个或多个对象与阵列反序列化杰克逊问题和对象
的阵列Foobar的例如用一个单一的值:
{
"foo": {"msg": "Hello World" }
}
Foobar的例子与阵列:
{
"foo": [
{ "msg": "Hello World" },
{ "msg": "Goodbye World" }
]
}
我想要的力的单一值成任何阵列,但到目前为止,我发现的唯一方式转换所有单个值阵列。
ACCEPT_SINGLE_VALUE_AS_ARRAY
http://wiki.fasterxml.com/JacksonFeaturesDeserialization
我一直在四处寻找,做同样的事,一个单一的财产,但到目前为止谷歌还没有止跌回升的任何实例的注释。
有没有人遇到这个问题之前,我真的不想重写所有的数组,使RestTemplate与一个马车服务工作。
答
我想要的力的单一值成任何阵列,但到目前为止,唯一 方式我发现转换所有单个值作为阵列。
这不应该是这样。 ACCEPT_SINGLE_VALUE_AS_ARRAY
属性是开启/关闭给定的ObjectMapper,但其行为完全由JSON值映射到的目标属性控制。
- 当ACCEPT_SINGLE_VALUE_AS_ARRAY打开时,将JSON值映射到Java集合属性不会导致错误。
- 当ACCEPT_SINGLE_VALUE_AS_ARRAY打开时,将JSON值映射到Java基本属性(也)不会导致错误。
通过下面的代码进行说明:
class Foo {
private String msg;
// Constructor, setters, getters
}
class Holder {
private List<Foo> foo;
private Foo other;
// Constructors, setters, getters
}
public class FooTest {
@org.junit.Test
public void testCollectionFromJSONValue() throws Exception {
final InputStream stream = Thread.currentThread()
.getContextClassLoader().getResourceAsStream("foo.json");
final String json = IOUtils.toString(stream);
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(
DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY,
true);
final Holder holder = mapper.readValue(json, Holder.class);
System.out.println(holder);
}
}
依赖于以下JSON:
{
"foo": {
"msg": "Hello World"
},
"other": {
"msg": "Goodbye"
}
}
运行代码会显示,“foo”的属性被成功反序列化到一个列表,而“其他”属性被反序列化为(基本)Foo类型。
答
我有同样的问题,并寻找解决方案,通常配置我的RestTemplate的方式挣扎。因为你不总是想实例化和改变一个objectMapper ...因此,这里是我的解决方案:
<bean id="myRestTemplate" class="org.springframework.web.client.RestTemplate">
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper" />
</bean>
</list>
</property>
</bean>
<bean id="jacksonObjectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" />
<bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" ref="jacksonObjectMapper" />
<property name="targetMethod" value="configure" />
<property name="arguments">
<list>
<value type="com.fasterxml.jackson.databind.DeserializationFeature">ACCEPT_SINGLE_VALUE_AS_ARRAY</value>
<value>true</value>
</list>
</property>
</bean>
然后,您可以通过将其注入你的代码中使用此预配置RestTemplate:
@Autowired
private RestTemplate myRestTemplate;
谢谢,这是一个漫长的一天,我也许应该从计算过,一个>。 Dan 2013-04-09 20:43:10
不用担心,欢呼,祝你好运。 – Perception 2013-04-09 20:44:49
在全球范围内(即对于整个应用程序)是否没有办法做到这一点,即将其配置在代码本身之外? – Amalgovinus 2017-07-26 20:25:45