2013-08-22 10 views
8

Ich habe eine Methode in meinem Controller, die einen String in JSON zurückgeben soll. Es gibt JSON für nicht primitive Typen:JSON für ResponseEntity zurückgeben <String>

@RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
ResponseEntity<String> so() { 
    return new ResponseEntity<String>("This is a String", HttpStatus.OK); 
} 

Die Locke Antwort ist:

This is a String 

Antwort

7
@RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public @ResponseBody String so() { 
    return "This is a String"; 
} 
+0

Es funktioniert auch nicht. Alles was ich überprüfen muss? – Sydney

+0

das funktioniert definitiv ... was bekommen Sie als Antwort und was genau benötigen Sie? – NimChimpsky

+0

Ich bekomme 'This is a String' und wenn ich ein Objekt zurückgebe, bekomme ich' {"repeatSecond": 15} '. Also für primitive scheint es, dass ich keine JSON-Zeichenfolge bekomme, aber für Objekt, das ich mache. – Sydney

10

Die Wurzel des Problems ist, dass Spring (via ResponseEntity, RestController und/oder ResponseBody) wird Verwenden Sie den Inhalt der Zeichenfolge als den unbearbeiteten Antwortwert, anstatt die Zeichenfolge als JSON-Wert zu behandeln, der codiert werden soll. Dies gilt auch, wenn die Controller-Methode produces = MediaType.APPLICATION_JSON_VALUE verwendet, wie in der Frage hier.

Es ist im Wesentlichen wie die Differenz zwischen dem folgenden:

// yields: This is a String 
System.out.println("This is a String"); 

// yields: "This is a String" 
System.out.println("\"This is a String\""); 

Der erste Ausgang nicht als JSON syntaktisch analysiert werden, aber die zweite Ausgabe kann.

Etwas wie '"'+myString+'"' ist jedoch wahrscheinlich keine gute Idee, da das korrekte Entkommen von doppelten Anführungszeichen in der Zeichenfolge nicht behandelt wird und kein gültiger JSON für eine solche Zeichenfolge erzeugt wird.

Eine Möglichkeit, dies zu umgehen, wäre, Ihre Zeichenfolge in ein Objekt oder eine Liste einzubetten, so dass Sie keine unbearbeitete Zeichenfolge an Spring übergeben. Das ändert jedoch das Format Ihrer Ausgabe, und wirklich gibt es keinen guten Grund, nicht in der Lage zu sein, eine richtig codierte JSON-Zeichenfolge zurückzugeben, wenn Sie das möchten. Wenn es das ist, was Sie wollen, ist der beste Weg, um damit umzugehen, ein JSON-Formatierer wie Json oder Google Gson. So könnte es bei Gson aussehen:

import com.google.gson.Gson; 

@RestController 
public class MyController 

    private static final Gson gson = new Gson(); 

    @RequestMapping(value = "so", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
    ResponseEntity<String> so() { 
     return ResponseEntity.ok(gson.toJson("This is a String")); 
    } 
} 
+1

Dies ist die richtige Antwort. Sie sollten sich wahrscheinlich fragen, ob Sie wirklich JSON für diesen Endpunkt unterstützen müssen, der nur eine Zeichenfolge zurückgibt. Wenn Sie nicht nur die Produktion auf Text/Ebene ändern. – CaptRespect

+0

Sollte als richtige Antwort statt vorher akzeptiert werden –

Verwandte Themen