2013-09-26 76 views
3

假設我有一個如下對象的列表:LinkedList<JsonAssessment> jsonAssessments...將Spring MVC中返回給ResponseBody的JSON對象重命名爲

它返回到這種方法:

@RequestMapping(value = "mapping", method = RequestMethod.POST) 
public 
@ResponseBody 
List<JsonAssessment> doSomething(....) { 
    ..... 
} 

我提出AJAX調用該控制器一切都如預期的那樣正常工作,但我不喜歡返回命名我的JSON。在螢火蟲我看到:

{"LinkedList":[{"assessmentName":"........ 

是我如何可以重命名根元素LinkedList這個問題?有我需要設置的配置嗎?

編輯

我不希望使用任何包裝對象。

編輯

我ObjectMapper:

public class JsonObjectMapper extends ObjectMapper { 

    public JsonObjectMapper() { 
     super(); 
     this.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true); 
     this.configure(SerializationFeature.WRAP_ROOT_VALUE, true); 
     this.setSerializationInclusion(JsonInclude.Include.NON_NULL); 
    } 

} 

春:3.2.4.RELEASE 傑克遜:2.1.2

編輯

該對象映射聲明在MVC消息轉換器中:

<mvc:annotation-driven content-negotiation-manager="contentNegotiationManager"> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> 
      <property name="objectMapper" ref="jsonObjectMapper"/> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

而這正是我已經與命名策略的嘗試:

public class JsonPropertyNamingStrategy extends PropertyNamingStrategy { 

    public static final MyNamingStrategy MY_NAMING_STRATEGY = new MyNamingStrategy(); 

    private static final LinkedHashMap<String, String> PROPERTIES = new LinkedHashMap<String, String>() {{ 
     put("LinkedList", "resultList"); 
    }}; 

    public static class MyNamingStrategy extends PropertyNamingStrategyBase { 

     @Override 
     public String translate(String propertyName) { 
      if (propertyName == null) { 
       return null; 
      } 

      if (PROPERTIES.containsKey(propertyName)) { 
       return PROPERTIES.get(propertyName); 
      } 

      return propertyName; 
     } 

    } 

} 

我調試它,當它涉及到翻譯方法屬性名稱來之外的所有根元素。我擁有包含LinkedList的所有內容,但LinkedList未提供此方法。

+0

你在哪裏接線這個ObjectMapper?這是正在使用的還是Spring默認的仍在使用?還有什麼你嘗試過'PropertyNamingStrategy'?最後一部分還不是很清楚。 (你只提到它不起作用)。 –

+0

已編輯,請看看。 – user2219247

+0

查看Jackson的來源''PropertyNamingStrategy'不會有幫助,因爲它僅用於屬性而不用於根類型。從源頭上看'RootNameLookup'正在處理翻譯,並且只允許使用註釋進行不同的命名,否則它將回退到類名。使用JAXB註釋時,傑克遜將使用這些元數據。 –

回答

0

列入名單的包裝類是AA普遍實施的戰略

+0

有沒有其他的策略不使用包裝類? – user2219247

0

如果您使用的傑克遜映射您可以使用標註由

@JsonProperty("foo") 

定義在類的屬性名稱或設置的順序

@JsonPropertyOrder({"foo", "bar"}) 

等等。

另見Jackson Annotations

編輯: 對不起,剛纔看到的包裝註釋。我看到的唯一的解決辦法是使用像這樣的包裝:How to rename root key in JSON serialization with Jackson

+0

還必須有一種使用PropertyNamingStrategy來做到這一點的方法,我面臨的問題是Spring MVC正在以某種方式處理它,而不是直接使用JAXB對象中的ObjectMapper序列化某些東西。在我的命名策略中,我沒有獲得'LinkedList'根元素屬性名稱,而在從JAXB對象序列化時,我得到了該對象的根元素。 – user2219247

3

而不是直接返回一個列表,它包裝到一個ResponseEntity裏面,會給你沒有一個根元素

@RequestMapping(value = "mapping", method = RequestMethod.POST) 
public 
@ResponseBody ResponseEntity<List<JsonAssessment>> doSomething(....) { 
..... 
return new ResponseEntity(yourList); 
} 

這樣,你的迴應沒有根元素。如果你仍然想要一個根元素,你可以將它添加到Map。結果在下面的JSON "[{"assessmentName":"........]

@RequestMapping(value = "mapping", method = RequestMethod.POST) 
public 
@ResponseBody ResponseEntity<Map<String, List<JsonAssessment>>> doSomething(....) { 
..... 
Map results = new HashMap(); 
result.put("assesments", yourlist); 
return new ResponseEntity(results); 
} 

應該輸出{"assesments":[{"assessmentName":"........

儘管你是在這裏消力池包裝的對象,它是可免費獲得的對象,你不必添加自己的自定義類。

這就是我們在@Controller中使用的幾個我們使用的Spring 3.2和Jackson 2.2。

+0

謝謝,但這不是我的解決方案。如果您爲JSON對象映射器指定序列化特徵,則可以避免在所有方法中使用ResponseEntity:'this.configure(SerializationFeature.WRAP_ROOT_VALUE,false);'(BTW false爲默認值),並且它將返回您,然後返回JSON而不包含根元素,它會是'{「assesments」:[{「assessmentName」:「........'但我需要一個根元素,我只想在沒有任何包裝的情況下重新命名它,不幸的是PropertyNamingStrategy仍然不起作用 – user2219247

+0

你如何配置ObjectMapper?發佈你的配置...還請指定你正在使用哪個Spring和Jackson版本 –

+0

編輯這個問題,請看看 – user2219247