Spring @ResponseBody为原始类型生成无效的JSON

时间:2012-10-16 09:01:51

标签: json spring rest jackson

我有一个来自REST API的代码,它使用@ResponseBody来返回结果,而MappingJacksonHttpMessageConverter则以JSON格式返回它。

这一切都适用于复杂的对象。 对于intbooleanstring这样的原语,我得到的JSON不是以{或[。 这不是有效的JSON。

我想知道返回这样一个简单类型的正确方法是什么? 我应该将其封装在{ Result : true }

等对象中

由于

代码示例:

@RequestMapping(
        value = "/login",
        method = RequestMethod.POST)
@ResponseBody
public boolean Login(String username, String password) {
    return authenticationService.authenticate(username, password);
}

这将只返回truefalse这是一个无效的JSON。它应该封装在一个对象或一个数组中(如果我理解正确的话)。

2 个答案:

答案 0 :(得分:8)

它只返回true或false。而你是正确的不是json。

它不能是json,因为它不是一个对象,它只是一个原语,所以它很好 - 它将被分配给你的成功处理程序中的一个javascript变量。

如果你返回一个布尔列表,你会得到一个数组:

[true,false,true]

如果你必须完全形成json,不要返回原语使用hashmap或自定义包装器对象。

public
@ResponseBody
Map<String, Boolean> getTrue() {
  Map<String, Boolean> map = new HashMap<String, Boolean>(1){{put("result", Boolean.TRUE);}};
  return map;
}

返回hashmap可能是获取所需json的最简单,最好的方法:

{"result":true}

答案 1 :(得分:4)

我发现使用方便

public class ObjWrapper<T> implements Serializable {

  private T obj;

  public ObjWrapper(T obj) {
    this.obj = obj;
  }

  public T getObj() {
    return obj;
  }

}

然后在控制器中:

@RequestMapping("/getString") @ResponseBody
public ObjWrapper<String> getString() { ...

和客户端(jquery)

$.getJson("getString", {}, function (data) {
            alert(data.obj);
          })

与列表相同:

public class ListWrapper<T> implements Serializable {

  private List<T> content;

  public ListWrapper(T... objects) {
    content = Arrays.asList(objects);
  }

  public ListWrapper(List<T> content) {
    this.content = content;
  }

  public List<T> getContent() {
    return content;
  }

}