2012-10-16 46 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; 
    } 

}