在我的ajax响应中,我想返回一个JSON结果。
我正在使用spring mvc,而且我的pom.xml中已经有了jackson。
现在在我的控制器动作中我有:
@ResponseBody
@RequestMapping(value = "/someAjaxResponse", method = RequestMethod.POST)
public String someAjaxResponse(HttpServletRequest request, HttpServletResponse response) {
}
你建议我使用内置的java数据结构/类型,然后我可以使用jackson将其转换为json吗?
我不想为每个响应类型创建一个新类,所以我正在为此寻找一个好的通用java类型。
建议?
为了转换为json,哪种方法最好,因为我知道jackson有多种方式转换对象,比如ObjectMapper,我相信你在整个应用程序中创建一个单独的实例并重复使用?那么这是否意味着我将其标记为最终?
答案 0 :(得分:2)
答案取决于您的使用案例。我的建议是你创建一个完全符合你需求的自定义值对象,返回它然后让杰克逊为你处理序列化:
@ResponseBody
@RequestMapping(value = "/someAjaxResponse", method = RequestMethod.POST)
public CustomValueObject someAjaxResponse(HttpServletRequest request, HttpServletResponse response) {
}
您所要做的就是将<mvc:annotation-driven />
或@EnableWebMvc
添加到您的应用程序上下文中,将Jackson依赖项添加到您的类路径中,然后该对象将自动序列化为JSON,因为您使用了@ResponseBody
注释。
阅读Spring参考手册中有关MappingJacksonHttpMessageConverter
的更多信息:
注意,返回的对象可以具有复杂的结构。想象一下,您希望向客户端提供人员数据,然后您可以从控制器方法返回Person
对象:
public class Person {
public String getFirstName() {...}
public int getAge() {...}
List<String> getEmailAddresses() {...}
Address getAddress() {...}
}
public class Address {
public String getStreet() {...}
public int getHouseNumber() {...}
public String getCity() {...}
public int getZIP() {...}
public String getState() {...}
}
可以序列化为:
{
"firstName": "John",
"lastName": "Doe",
"age": 42,
"emailAddresses": [
"john@doe.com",
"john.doe@somewhere.com"
],
"address": {
"street": "First Avenue",
"houseNumber": 123,
"city": "Smallville",
"ZIP": 12345,
"state": "CA"
}
}