2016-09-07 4 views
0

Ich habe diesen einfachen Code verwendet:JsonObject als Einheit für Jersey 2 Antwort

package com.example 

import javax.json.Json; 
import javax.json.JsonObject; 

... 

@Path("/") 
public class Resource { 
    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public Response defaultEntry() { 
     JsonObject result = (Json.createObjectBuilder() 
          .add("hello", "world") 
          .build()); 

     return Response.status(200).entity(result.toString()).build(); 
    } 
} 

Ich bin neu in Java, könnte jemand bitte erklären, warum, wenn ich den Anruf zu result.toString() weglassen und einfach result-.entity passieren (etwa so: return Response.status(200).entity(result).build()), erhalte ich JSON auf dem Client, etc geben Informationen beinhaltet, ist aber nicht das, was ich erwartet hatte:

{"hello":{"chars":"world","string":"world","valueType":"STRING"}} 

was die Absicht ist das? Wie unterscheidet es sich von JsonObject davon, eine Zeichenfolge zu übergeben?

Auch habe ich Response.entity Methode in der Dokumentation (https://jersey.java.net/apidocs/2.11/jersey/javax/ws/rs/core/Response.html) nicht gefunden. Ich kopierte diesen Code aus einem Tutorial, das nicht richtig erklärt, was los ist ...

+0

was erwarten Sie? nur Werte? –

+0

Wissen Sie, welchen JSON-Serializer Sie verwenden? Moxy, Jackson, Gson usw.? –

+0

Ich erwarte '{" Hallo ":" Welt "}'. Ich weiß nicht, welchen Serialisierer ich verwende. Wie finde ich heraus? – akonsu

Antwort

0

Ich wünschte, ich hätte eine bessere Antwort für Sie, dies eher ein Hinweis, bis eine bessere Antwort eintrifft. Es gibt ein paar bewegliche Teile hier. JsonObject ist eine Schnittstelle. Seine Implementierung wird nicht beschrieben. Außerdem gibt es einen Json-Serializer, der Ihre zurückgegebenen Objekte in Json-Text umwandelt. Es sind diese beiden Dinge zusammen, die zu diesem Json-Schema-Output führen. Wenn Sie die .toString() Variante ausgeführt haben, hat der Serializer den String so zurückgegeben, wie er ist. Aber wenn Sie das JsonObject jetzt zurückgeben, haben Sie diese zwei Dynamiken im Spiel, die Implementierung des JsonObject und die Implementierung des Serialisierers. Da Sie Jersey 2.0 verwenden, könnten Sie Jackson, Moxy oder Jettison Serializer verwenden. Bei der Serialisierung des JsonObject könnten diese alle unterschiedliche Ausgaben haben, aber wir müssten es testen, um sicher zu gehen. Darüber hinaus könnte die JsonObject-Implementierung so konfiguriert sein, dass, wenn sie von Ihrem gewählten Serializer serialisiert wird, die Ausgabe zu einem Json-Schema führt, im Gegensatz zu nur Json. Dies kann mithilfe von Anmerkungen erfolgen, die für den ausgewählten Json-Serializer spezifisch sind.

In meiner Karriere habe ich mehrere Json-Serialisierer verwendet. Jackson ist wahrscheinlich der populärste da draußen. Aber ich habe auch Gson ausgiebig benutzt. In einem Projekt haben wir Gson so konfiguriert, dass seine serialisierte JSON-Ausgabe als JSON-Schema bei der Serialisierung von POJOs herauskam. So ist es nicht weit hergeholt, dass ein Json-Serializer unter bestimmten Bedingungen ein JSON-Schema ausgibt.

Beim Serialisieren von POJOs (Java Beans) erwarten Sie eine normale Json-Ausgabe, wenn Sie die Standardeinstellungen Ihres Serialisierers auf einem Java-Bean verwenden. Beim Zurücksenden von Objekten, die komplexe Interworkings mit bestimmten Json-Serialisierern haben, können Sie jedoch unterschiedliche Json-Ausgaben erhalten.

In dieser Situation müssten Sie Tests durchführen, um tiefer in das Geschehen einzutauchen. Zum Beispiel würde ich zuerst den Serializer gegen einen POJO testen, der mit dem von Ihnen erstellten JsonObject übereinstimmt. Dann würde ich auch andere Json-Serialisierer auf demselben JsonObject testen. Sehen Sie, ob Sie ein Muster aufnehmen können.

Verwandte Themen