2013-04-09 68 views
1

我运行到一个问题,即我的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与一个马车服务工作。

回答

7

我想要的力的单一值成任何阵列,但到目前为止,唯一 方式我发现转换所有单个值作为阵列

这不应该是这样。 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类型。

+0

谢谢,这是一个漫长的一天,我也许应该从计算过,一个>。< – Dan 2013-04-09 20:43:10

+0

不用担心,欢呼,祝你好运。 – Perception 2013-04-09 20:44:49

+0

在全球范围内(即对于整个应用程序)是否没有办法做到这一点,即将其配置在代码本身之外? – Amalgovinus 2017-07-26 20:25:45

1

我有同样的问题,并寻找解决方案,通常配置我的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;