2010-11-18 19 views
1

Comment produire même format JSON jqGrid nécessite:JQuery jqGrid: Comment simplifier JSON via Spring MVC

En ce moment, mon contrôleur Spring est capable de produire la sortie JSON suivante:

{ 
    "records":"5", 
    "total":"20", 
    "page":"1" 
    "rows":[ 
     {"id":"1","cell":["1","john","smith"]}, 
     {"id":"2","cell":["2","jane","adams"]} 
     ] 
} 

Voilà la méthode du contrôleur ressort qui produit cette sortie:

@RequestMapping(value = "/json", method = RequestMethod.GET) 
public @ResponseBody getUsers viewUsersAsJSON() { 

    logger.debug("Retrieving all users as JSON"); 

    UsersJsonDTO usersJsonDTO = new UsersJsonDTO(); 
    usersJsonDTO.setPage("1"); 
    usersJsonDTO.setRecords("5"); 
    usersJsonDTO.setTotal("20"); 

    ArrayList<RowJson> rowJsonList = new ArrayList<RowJson>(); 
    for (UserRoleDTO userRoleDTO:userRoleServiceFacade.getAll()) { 
     RowJson rowJson = new RowJson(); 
     rowJson.setId(userRoleDTO.getId().toString()); 
     rowJson.setCell(userRoleDTO.getFirstName()); 
     rowJson.setCell(userRoleDTO.getLastName()); 

     rowJsonList.add(rowJson); 
    } 

    usersJsonDTO.setRows(rowJsonList); 

    return usersJsonDTO; 
} 

Voici UsersJsonDTO:

public class UsersJsonDTO { 

    private String page; 
    private String total; 
    private String records; 
    private ArrayList<RowJson> rows; 

    ...getters/setters etc... 
} 

Voilà RowJson:

public class RowJson { 

    private String id; 

    private List<String> cell; 

    public RowJson() { 
     cell = new ArrayList<String>(); 
    } 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    public List<String> getCell() { 
     return cell; 
    } 

    public void setCell(String cell) { 
     this.cell.add(cell); 
    } 


} 

Ce sont les classes qui sont nécessaires au produit la sortie de l'échantillon que j'ai donné au début de cette question. @ResponseBody convertit automatiquement l'objet renvoyé en JSON. Voir Spring Ajax Simplifications 3.0

Je veux une mise en œuvre beaucoup plus propre et simple. Je veux quelque chose comme ça (bien sûr, je l'ai essayé celui-ci et il ne donne pas la sortie correcte):

@RequestMapping(value = "/json", method = RequestMethod.GET) 
public @ResponseBody getUsers viewUsersAsJSON() { 

    logger.debug("Retrieving all users as JSON"); 

    UsersJsonDTO usersJsonDTO = new UsersJsonDTO(); 
    usersJsonDTO.setPage("1"); 
    usersJsonDTO.setRecords("5"); 
    usersJsonDTO.setTotal("20"); 

    usersJsonDTO.setRows(userRoleServiceFacade.getAll()); 

    return usersJsonDTO; 
} 

Toutes les idées? Merci pour votre temps.

J'aime aussi être en mesure de produire le format suivant:

{ 
    "records":"5", 
    "total":"20", 
    "page":"1" 
    "rows":[ 
     {"id":"1","cell":["id":"1","name":"john","lastname":"smith"]}, 
     {"id":"2","cell":["id":"2","name":"jane","lastname":"adams"]} 
     ] 
} 

Cependant, lorsque je tente, je reçois les accolades supplémentaires suivants (entre la cellule et id):

{ 
    "records":"5", 
    "total":"20", 
    "page":"1" 
    "rows":[ 
     {"id":"1","cell":[{"id":"1","name":"john","lastname":"smith"}]}, 
     {"id":"2","cell":[{"id":"2","name":"jane","lastname":"adams"}]} 
     ] 
} 

Beaucoup de questions mais je pense qu'ils sont liés.

Répondre

1

J'aime aussi être en mesure de produire le format suivant:

C'est JSON invalide. Plus précisément, ce qui suit:

["id":"1","name":"john","lastname":"smith"] 

A [] désigne un littéral de tableau, et les tableaux JSON sont des listes, ils ne peuvent contenir que des indices numériques. Si vous voulez un hash (aka map, etc.), dans lequel vous pouvez utiliser des clés de chaîne, vous devez utiliser un objet, ce qui expliquerait pourquoi le littéral d'objet {} continue à être inséré.

+0

Merci pour la réponse. Si ce qui suit est invalide JSON: {"id": "1", "cellule": ["id": "1", "nom": "john", "nom": "smith"]}, pourquoi est-ce le format requis de JQuery JqGrid? Le format suivant est généré correctement par Spring: {"id": "1", "cell": [{"id": "1", "name": "john", "lastname": "smith"}]} , – chris

+0

Mais ce n'est * pas * le format requis de jqGrid! Vous ne regardez pas leurs exemples avec suffisamment d'attention. Je vous suggère de lire sur json.org si vous utilisez beaucoup JSON. – ken

0

J'ai trouvé la solution. D'abord, laissez-moi vous expliquer comment j'ai obtenu la réponse. Je lisais un article jQuery Grid Data with jqGrid by Jack Altiere. Il a pointé un lien vers le wiki JqGrid que j'ai déjà lu auparavant. Puis il a également pointé un autre lien vers ce JSON Data qui inclut des informations sur le format JSON attendu par JqGrid. Je pense que c'est une copie de la documentation officielle, mais beaucoup plus facile dans les yeux en raison de la plus grande police.

Ce que vous devez faire est sur le format jqGrid Javascript, vous devez définir les repeatitems à faux.Cela vous permettra d'utiliser le format suivant:

{ 
     "records":"5", 
     "total":"20", 
     "page":"1" 
     "rows":[ 
      {"id":"1","name":"john","lastname":"smith"}, 
      {"id":"2","name":"jane","lastname":"adams"}] 
    } 

Mon printemps mise en œuvre Controller:

@RequestMapping(value = "/json", method = RequestMethod.GET) 
public @ResponseBody getUsers viewUsersAsJSON() { 

    logger.debug("Retrieving all users as JSON"); 

    UsersJsonDTO usersJsonDTO = new UsersJsonDTO(); 
    usersJsonDTO.setPage("1"); 
    usersJsonDTO.setRecords("5"); 
    usersJsonDTO.setTotal("20"); 

    usersJsonDTO.setRows(userRoleServiceFacade.getAll()); 

    return usersJsonDTO; 
} 

Est-ce que je réalise ce que je demande. Définitivement oui! L'affaire est close :)