2014-11-08 30 views
0

我有一個用於REST通信的spring-MVC。這是控制器:Spring MVC:解析JSON文檔時出現錯誤

@RestController 
@RequestMapping("/db") 
public class RestController { 

    @Inject 
    private EmpRepositoryImpl empRepository; 


    @RequestMapping(value = "/{tableName}.json", method = RequestMethod.GET, produces = "application/json") 
    public String getTableRecords( @PathVariable String tableName){ 

     List<Map<String, Object>> resultList = empRepository.getAllEmpRecords(tableName); 

     return resultList.toString(); 
    } 

} 

,結果我在Firefox中得到是這樣的:

There was an error parsing the JSON document. The document may not be well-formed. 
expected property name or '}' at line 1 column 3 
[{nodeID=0, neo_eb_id=11, neo_eb_bossID=11, neo_eb_name='Smith'}, {nodeID=1, neo_eb_id=12, neo_eb_bossID=11, neo_eb_name='Johnson'}, {nodeID=2, neo_eb_id=13, neo_eb_bossID=11, neo_eb_name='Roberts'}, {nodeID=3, neo_eb_id=14, neo_eb_bossID=13, neo_eb_name='Doe'}] 
  1. 什麼似乎是與彈簧產生這個JSON格式的問題?

  2. 如何顯示這個結果在JSON可以與縮進和突出的東西,因爲它需要在其他地方的JSON我用Firefox打開顯示在養眼的語法?

+2

你爲什麼使用resultList.toString()方法?你爲什麼不從這個方法返回一個列表,並讓傑克遜或你正在使用的庫轉換它?我寧願從控制器方法中返回resultList。 – RE350 2014-11-08 19:26:18

+0

嗯,我認爲如果我聲明'produce =「application/json」',那麼spring將使'json不在'getTableRecords'中。 我不能只是返回一個列表,因爲它是。你是什​​麼意思返回一個列表? – Szczepan 2014-11-08 20:11:27

回答

1

將其更改爲

@RestController 
@RequestMapping("/db") 
public class RestController { 

    @Inject 
    private EmpRepositoryImpl empRepository; 


    @RequestMapping(value = "/{tableName}.json", method = RequestMethod.GET, produces = "application/json") 
    @ResponseBody 
    public List<Map<String, Object>> getTableRecords( @PathVariable String tableName){ 
     return empRepository.getAllEmpRecords(tableName); 
    } 
} 

假設你使用Spring 3.2.x中,彈簧會自動註冊MappingJackson2HttpMessageConverter是能夠轉換由處理器的方法來有效的JSON返回的值。該轉換器支持application/json,並且將在春季自動創建並註冊,除非Jackson不在類路徑中(也許您必須手動將Jackson添加到類路徑中)。只要你沒有任何先進的要求,Spring默認的Jackson配置就足夠了,並且完美地工作。

此外,通過使用此方法(@ResponseBody並返回模型本身,而不是特定的表示形式),您可以基於例如Accept頭部使用不同的轉換器(例如,用於XML),而無需改變你的控制器。您只需將其他轉換器添加到Spring配置中。

這種方法的一個非常重要的好處是....你有可測試的代碼!

+0

感謝您提供準確的答案和詳細的收益。我接受這個解決方案。 – Szczepan 2014-11-09 10:23:38

-1

{nodeID=0, neo_eb_id=11, neo_eb_bossID=11, neo_eb_name='Smith'}不正確的JSON語法。它應該是{nodeID:0, neo_eb_id:11, neo_eb_bossID:11, neo_eb_name:'Smith'}:而不是=來分隔字段名稱和值)。一個更好的版本將是{ "nodeID"= 0, "neo_eb_id"= 11, "neo_eb_bossID"= 11, "neo_eb_name"= "Smith" }

嘗試在http://jsonlint.com處驗證您的JSON以查找特定問題。