2013-04-09 90 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;