Richtigen Weg für das Parsen von JSON-Objekten, die arrays in Java-Servlets (mit Gson zum Beispiel)

Ich weiß, das ist ein Thema viel geredet, aber ich war immer noch nicht in der Lage zu finden, eine richtige und klare Antwort zu meinem spezifischen problem.

Habe ich eine JSON sieht wie folgt aus:

var myData = {  "gameID" : gameID,
                "nrOfPlayers" : 2,
                "playerUIDs" : [123, 124]
            };

Die Frage, die ich habe, ist genau das, was ist der richtige Weg (oder beste Weg, Stil, Weise) zu analysieren, diese in ein Java-servlet (mit GSON zum Beispiel)? Zuerst sende ich diese JSON an den server mithilfe von jQuery-ajax-Methode wie diese:

jQuery.ajax({
        url : path,
        data : myData,
        success : successFunction,
        error : function(data) {
            console.log("Error: ", data);
        }  ,
        type : "post",
        timeout : 30000
    });

Nun im servlet habe ich gelernt, dass ich in der Lage gewesen zu analysieren, dass JSON-so:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Gson gson = new Gson();

        String gameID = gson.fromJson(request.getParameter("gameID"), String.class);
        String nrOfPlayers = gson.fromJson(request.getParameter("nrOfPlayers"), String.class);
        String[] playerUIDs = gson.fromJson(request.getParameter("playerUIDs"), String[].class);

        log.info(gameID);
        log.info(nrOfPlayers);
        log.info(playerUIDs[0] +" "+ playerUIDs[1]);
}

Aber die playerUIDs variable NULL IST, und natürlich playerUIDs[0] wirft eine Ausnahme!

Tiefer zu Graben fand ich, dass beim Schleifen über die request-parameter-Namen, es enthielt eine parameter mit dem Namen "playerUIDs[]" mit der Wert von nur 123 (die erste int im array). Das war seltsam, weil ich anscheinend nicht in der Lage sein, um Zugriff auf die nächsten Werte überhaupt.

Dann habe ich gelesen, dass die JSON-Objekte werden sollte stringifyed vor POST-ing also ich habe JSON.stringify(myData), aber jetzt sind die request-parameter-Namen nur enthalten EINEN Namen das war das JSON-Objekt selbst in einer stringified Zustand:

INFO: Parameter name = {"gameID":"b6a51aabb8364b04bce676eafde1bc87","nrOfPlayers":2,"playerUIDs":[123,124]}

Der einzige Weg, der mir schien diese Arbeit wurde durch die Schaffung einer inneren Klasse:

class GameStart {
    protected String gameID;
    protected int nrOfPlayers;
    protected int[] playerUIDs;
}

Und Parsen von JSON aus dem request-parameter name, so wie hier:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Gson gson = new Gson();
        Enumeration en = request.getParameterNames();
        GameStart start = null;
        while (en.hasMoreElements()) {
            start = gson.fromJson((String) en.nextElement(), GameStart.class);
        }
        log.info(start.gameID);
        log.info(String.valueOf(start.nrOfPlayers));
        log.info(start.playerUIDs[0] +" "+ start.playerUIDs[1]);
}

Nun alle Werte sind vorhanden, aber dies scheint mehr wie ein hack (Lesen von JSON von request-parameter name), als eine elegante Lösung, so dass ich dachte, ich würde Sie bitten, Jungs, was genau wäre der "richtige" Weg, dies zu tun? Übersehe ich etwas offensichtliches?

Vielen Dank im Voraus!

InformationsquelleAutor Tõnis Pool | 2012-03-22
Schreibe einen Kommentar