2012-10-16 48 views
7

我有一个来自REST API的代码,它使用@ResponseBody返回结果,并且MappingJacksonHttpMessageConverter以JSON格式返回它。Spring @ResponseBody为原始类型生成无效的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。它应该被封装在一个对象或数组中(如果我理解正确)。

回答

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} 
+0

的问题是,有些事是期待一个正确的JSON。例如,在Flex中封装REST API调用的Flex Builder工具预期结果为JSON。 – Oxmane

+0

将数据粘贴到自定义包装对象或散列映射中 – NimChimpsky

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() { ... 

and on client( 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; 
    } 

}