Решение проблемы вложенных JSON с помощью Spring-Hibernate - PullRequest
0 голосов
/ 21 марта 2012

Я использую Spring MVC и Джексона для моего приложения extjs и застрял на чем-то похожем.У меня есть список записей, возвращаемых из БД с использованием Hibernate. Класс DAO:

@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();

}

Класс контроллера

 @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 в требуемомформат в соответствии с моим приложением. Я получаю формат вложенным способом, который не принимается 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": "bj.vikram@gmail.com"
        },
        "statusTitle": "Shortlisted"
    }],
    "success":true,
    "total":7668

}

Я хочу, чтобы json был плоскимфайл, как это без вложенности.

"data": [ {
           "clientName": "ABC"
           "firstName": "Suynil",
            "lastName": "Seelam",
            "email": "ss.seelam@gmail.com",
              "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 к модели, я получаю только запись LAST . Почему ???

Спасибо

Ответы [ 2 ]

0 голосов
/ 21 марта 2012

Ваш подход будет работать, если вы измените свою работу с картой 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 >();

Loop inКонтроллер:

 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 голосов
/ 21 марта 2012

Я не думаю, что ваш второй пример является верным JSON, по крайней мере, согласно json.org .Объект определяется как:

неупорядоченный набор пар имя / значение.Объект начинается с {(левая скобка) и заканчивается} (правая скобка).Каждое имя сопровождается: (двоеточие) и пары имя / значение разделяются, (запятая).

Это говорит о том, что JSON должен начинаться с '{' и заканчиваться '}».

...