2016-03-21 3 views
0

Situation: Ich ändere das Webanwendungsprojekt eines Freundes. Es verwendet Spring MVC und Java, JQgrid und GSON.Mein JSON-Format unterscheidet sich vom Standard-JSON-Format, das von JQGrid akzeptiert wird, funktioniert aber weiterhin. Wie?

Projekt hat eine Student.java Modellklasse, StudentDaoImpl.java DAO-Klasse und einen Buisness-Class mit listStudentData() Dienst, der eine Liste von Student Objekten zurückgibt, und Projekt verwendet jqGrid jQuery-Plugin Schülerdaten in view.jsp anzuzeigen.

View.jsp einmal geladen folgende Ajax-Anforderung macht student Daten abzurufen:

function initiate() { 
$.ajax({ 
     type : 'GET', 
     dataType : "json", 
     url : 'listStudentData', 
     success : function (data) 
     { 
      $("#tabel").jqGrid({ 
       data: data, 
       colNames: ["name" ,"id"], 
       datatype: "local", 
       colModel:[{ 
       name : 'studentName', 
       index : 'studentName', 
       width : '290px' 
       }, { 
       name : 'studentId', 
       index : 'studentId', 
       width : '220px' 
       }] 
       rowNum:25, 
       viewrecords: true, 
       pager: "#div", 
       scrollOffset: 0, 
       emptyrecords:"No records", 
       height: 'auto', 
       caption: "student data", 
       grouping: false, 
       groupingView : {}, 
      }); 
     } 
    }); 
} 

-Controller Umgang mit dieser Antwort:

@RequestMapping(value = "/listStudentData", method = RequestMethod.GET) 
public @ResponseBody 
String listStudentData() { 
    final List<Student> list = studentBusiness.listStudentData(); 
    return gson.toJson(list); 
} 

Meine json Antwort von diesem Controller ist wie folgt:

[{"studentName":"x" , "StudentId" : "[email protected]" },{"studentName":"Y" , "StudentId" : "[email protected]"}] 

Und Code funktioniert gut und geben korrekte Ausgabe!

Problem: Jetzt durch Dokumentation von jqGrid (http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data), ich werde ist es klar gesagt, dass json-Format von jqGrid erwartet ist wie folgt:

{ 
"total": "xxx", 
"page": "yyy", 
"records": "zzz", 
"rows" : [ 
{"id" :"1", "cell" :["cell11", "cell12", "cell13"]}, 
{"id" :"2", "cell":["cell21", "cell22", "cell23"]} 
] 
} 

und JSON-Format von gson Bibliothek erzeugt wird, dass wird gesendet als Antwort ist anders als dieses Format dann, wie es richtig funktioniert? Ich suchte das Projekt nach einem benutzerdefinierten JsonReader, konnte aber keinen finden. Fehle ich etwas, wenn nicht, wie funktioniert dieser Code?

+0

Es wird nicht immer von dem von Ihnen bereitgestellten Format benötigt, es hängt vom Raster ab. –

+0

Sie sagen, dass das Json-Format, in das Gson die Java-Objekte konvertiert, direkt an JqGrid ohne irgendeinen benutzerdefinierten Jsonreader geliefert werden kann. –

+0

'Gson' ist eine Bibliothek, die Ihnen hilft, Ihre Java-Objekte in 'Json'-Typ zu konvertieren. Siehe [Referenzen1] (https://sites.google.com/site/gson/gson-user-guide), [References2] (https://google-gson.googlecode.com/svn/trunk/gson/docs/ javadocs/com/google/gson/Gson.html) und [Google Gson zum Konvertieren von Java-Objekten in JSON] (http://www.vogella.com/tutorials/JavaLibrary-Gson/article.html) –

Antwort

0

Siehe gson Referenz für gson.toJson(obj)

public String toJson (Object src)

Diese Methode serialisiert das angegebene Objekt in seine äquivalente Json Darstellung. Diese Methode sollte verwendet werden, wenn das angegebene Objekt kein generischer Typ ist. Diese Methode verwendet Object.getClass(), um den Typ für das angegebene Objekt abzurufen, aber die getClass() verliert die generische Typinformation aufgrund der Type Erasure-Funktion von Java. Sehen Sie das offizielle Dokument Gson

Parameter: src - das Objekt, für das Json Darstellung ist sein erstellt Einstellung für Gson Rückkehr: Json Darstellung von src.

Überprüfen Sie diese Demo, die die gleichen Daten wie Ihre JSON verwendet, um jQgrid zu erstellen.

+0

dann warum in der Dokumentation von jqgrid ist ein anderes json-Format aufgelistet http://www.trirand.com/jqgridwiki/doku.php?id=wiki:retrieving_data –

+0

Ja, es ist eine Standardstruktur, aber nirgendwo im Dokument steht, es ist der einzige Weg. Sie laden die lokalen Daten. 'dataType:" local "' wie du erwähnt hast. Sie laden den JSON-Datentyp. Wenn Sie den Datentyp in Ihrer Rasterdefinition ändern, können Sie dies nachvollziehen. –

0

Ihre json-Antwort ist ein JSON-Array. Daher denke ich, dass der Abschnitt "Array Data" des Handbuchs gilt. Sie geben an, ein Array unter Verwendung von datatype: "local" zu akzeptieren (was, wie im Handbuch angegeben, dasselbe ist wie datatype: "clientSide") Mit colName liefern Sie bereits die korrekte Information, wie das Array zu interpretieren ist. Sie könnten dies versuchen, indem Sie den Wert datatype ändern und sehen, ob die Array-Antwort noch korrekt verwendet wird.

Verwandte Themen