2012-03-21 12 views
0

我爲我的extjs應用程序使用spring mvc和jackson,並且卡住了一些類似的東西。 我有使用Hibernate從數據庫返回的記錄列表。 DAO類:使用Spring-Hibernate解決嵌套的JSON問題

@SuppressWarnings("unchecked") 
@Override 
public List<CandidateStatus> getcandidateStatus() { 

    //return hibernateTemplate.find("select candstat.candidate.firstName as firstName,candstat.candidate.lastName as lastName,candstat.candidate.email as email,candstat.statusTitle as statusTitle,candstat.requirement.client.clientName as clientName,candstat.requirement.reqTitle as reqTitle from CandidateStatus as candstat"); 
    return hibernateTemplate.find("from CandidateStatus"); 
    //return hibernateTemplate.find("from CandidateStatus candstat left outer join candstat.candidate left outer join candstat.requirement left outer join candstat.requirement.client"); 
    //return hibernateTemplate.find("from Candidates as cands inner join cands.candidateStats"); 


} 

**Service class** 
public List<CandidateStatus> getCandidateStatusList() 
{ 
    //return candidatesDAO.getCandidates(); 
    return candidatesDAO.getcandidateStatus(); 

} 

Controller類

@RequestMapping(value="/candidates/view.action") 
public @ResponseBody Map<String,? extends Object> view() throws Exception { 

    try{    
     //List<Candidates> candidates = candidatesService.getCandidatesList(); 
     List<CandidateStatus> candidatestatus = candidatesService.getCandidateStatusList(); 

     return getMap(candidatestatus); 

    } catch (Exception e) { 

     return getModelMapError("Error retrieving Candidates from database."); 
    } 


private Map<String,Object> getMap(List<CandidateStatus> candidatestatus){ 
    Map<String,Object> modelMap = new HashMap<String,Object>(3); 
    modelMap.put("success", true); 
    modelMap.put("total", candidatestatus.size()); 
    modelMap.put("data", candidatestatus); 

    return modelMap; 
} 

private Map<String,Object> getModelMapError(String msg){ 

    Map<String,Object> modelMap = new HashMap<String,Object>(2); 
    modelMap.put("message", msg); 
    modelMap.put("success", false); 

    return modelMap; 
} 

之前將其添加到地圖我要格式化的JSON在要求的格式按我application.I獲得格式不被extjs接受的嵌套方式。

{ 
"data": [ 
    { 
     "id": 29, 
     "requirement": { 
      "id": 27, 
      "client": { 
       "id": 12, 
       "clientName": "HireCraft" 
      }, 
      "clientId": 12, 
      "reqTitle": "Support Engineer" 
     }, 
     "reqid": 27, 
     "resid": 45, 
     "candidate": { 
      "id": 45, 
      "firstName": "Vikram", 
      "lastName": "", 
      "email": "[email protected]" 
     }, 
     "statusTitle": "Shortlisted" 
    }], 
    "success":true, 
    "total":7668 

}

我想要的JSON是這樣的平面文件沒有嵌套。

"data": [ { 
      "clientName": "ABC" 
      "firstName": "Suynil", 
      "lastName": "Seelam", 
      "email": "[email protected]", 
       "reqTitle": "Java"}]success:true,total:768} 

請問你能指導我如何達到這個目標。 我試了一下,得到了一些東西。

private Map<String,Object> getMap(List<CandidateStatus> candidatestatus){ 

    Map<String,Object> modelMap = new HashMap<String,Object>(3); 
    Map<String,Object> candDetails = new HashMap<String,Object>(7); 


    Iterator<CandidateStatus> iterator=candidatestatus.iterator(); 
    CandidateStatus astring = new CandidateStatus(); 
    String Client; 
    String Fname; 
    String Lname; 
    String Email; 
    String Phone; 
    String Status; 
    String Require; 

    while(iterator.hasNext()) 
    { 
     astring = iterator.next(); 
     /*System.out.println(astring.getCandidate().getFirstName()); 
     System.out.println(astring.getCandidate().getLastName()); 
     System.out.println(astring.getCandidate().getEmail()); 
     System.out.println(astring.getStatusTitle()); 
     System.out.println(astring.getRequirement().getReqTitle());*/ 

     Client = astring.getRequirement().getClient().getClientName(); 
     Fname = astring.getCandidate().getFirstName(); 
     Lname = astring.getCandidate().getLastName(); 
     Email = astring.getCandidate().getEmail(); 
     Phone = astring.getCandidate().getPhone(); 
     Status = astring.getStatusTitle(); 
     Require= astring.getRequirement().getReqTitle(); 

     candDetails.put("clientName",Client); 
     candDetails.put("firstName",Fname); 
     candDetails.put("lastName",Lname); 
     candDetails.put("email",Email); 
     candDetails.put("phone",Phone); 
     candDetails.put("statusTitle",Status); 
     candDetails.put("reqTitle",Require); 
     //jsonMap.put("root", candDetails); 
     //System.out.println(jsonMap); 
    } 
    //System.out.println("----"+candDetails+"----"); 
    modelMap.put("success", true); 
    modelMap.put("total",candDetails.size()); 
    modelMap.put("data",candDetails); 

return modelMap; 

現在,當我嘗試candDetails添加到modelMap我只得到最後一個記錄。爲什麼呢???

感謝

+0

僅供參考Grails可以簡化配置和JSON支持 - 並且您可以獲得相同的hibernate/spring框架:)只是需要考慮的事情。 – dbrin 2012-03-23 21:57:04

+0

@DmitryB感謝您分享您的觀點,但這裏至今沒有Grails知識。 :(這將有助於我,如果你可以添加幾個例子的指針:) – coderunner 2012-03-24 10:39:24

+0

在這裏你去:http://www.grails.org/Documentation – dbrin 2012-03-25 00:25:54

回答

0

我不認爲你的第二個例子是有效的JSON,至少根據json.org。一個對象被定義爲:

一組無名的名稱/值對。一個對象以{(左大括號)開始並以}(右大括號)結束。每個名稱後跟:(冒號),名稱/值對由(逗號)分隔。

這告訴我,JSON必須以'{'開始並以'}'結尾。

+0

有一個錯字,它有一個開始的'{'括號,最後一個我有它。此外,它只是我想要的嵌套(這是返回)格式的方式。感謝您的反饋 – coderunner 2012-03-21 11:31:11

0

你的方法將工作,如果你改變你的地圖candDetails女巫工作是有點傻。在你的循環中,你將數據放在同一個鍵上,這就是爲什麼你用最後一次迭代得到數據。

我建議你編寫自定義包裝對象(可以稱之爲CandidateStatusWrapper並建立有你​​需要的所有結構。然後你只需返回封裝對象列表。

包裝例如:

class CandidateStatusWrapper { 
String clientName; 
String firstName; 
public CandidateStatusWrapper(String clientName, String firstName) { 
    this.clientName = clientName; 
    this.firstName = firstName; 
} 
} 

更改地圖:

Map<String,Object> candDetails = new HashMap<String,Object>(7); 

到列表:

List<CandidateStatusWrapper> = new ArrayList<CandidateStatusWrapper >(); 

迴路中控制器:

while(iterator.hasNext()) 
    { 
     astring = iterator.next(); 

     Client = astring.getRequirement().getClient().getClientName(); 
     Fname = astring.getCandidate().getFirstName(); 

     CandidateStatusWrapper wrapped = new CandidateStatusWrapper(Client, Fname); 
     candDetails.add(wrapped); 

    } 
+0

感謝您的答案,但使用地圖的原因建立一個**名稱=值**配對關係(因爲我正在建立一個JSON數組)我不知道這是否會實現它(列表使用默認鍵,如果不是錯誤)。你說在你的循環中你把數據放在同一個鍵上,這就是爲什麼你用最後一次迭代得到數據。所以,我應該迭代列表中的鍵嗎?請糾正我。 – coderunner 2012-03-22 04:54:18

+0

我沒有看到您的JSON示例中的任何鍵。無論如何,只需生成一些獨特的關鍵字,並將您的CandidateStatus objast作爲地圖中的值。 candDetails.put(unique_key,candidateStatus);' – vacuum 2012-03-22 07:19:57

+0

candDetails.put(「clientName」,Client); ** clientName =名稱和客戶端(來自列表)=值** 同樣,我想爲每個條目。我有我的預期JSON '{「data」:[{「clientName」:「ABC」** 「firstName」:「Suynil」, 「lastName」:「Seelam」, 「email」 :「[email protected]」, 「reqTitle」:「Java」}]成功:true,總數:768} '再次感謝您。我正在使用Jackson,他們也是一種實現方式這個??否則我將不得不採用Java方式嗎?請給你的意見/建議他們有幫助。 – coderunner 2012-03-22 08:13:15