2013-09-26 77 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