什么是用于jackson json转换的良好的内置数据结构?

时间:2012-10-20 16:17:38

标签: java json spring spring-mvc jackson

在我的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,我相信你在整个应用程序中创建一个单独的实例并重复使用?那么这是否意味着我将其标记为最终?

1 个答案:

答案 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"
    }
}