समस्या की जड़ है कि वसंत (ResponseEntity, RestController, और/या ResponseBody के माध्यम से) होगा JSON मान को एन्कोड किए जाने के रूप में स्ट्रिंग के इलाज के बजाय कच्चे प्रतिक्रिया मान के रूप में स्ट्रिंग के सामग्री का उपयोग करें। यह तब भी सही है जब नियंत्रक विधि produces = MediaType.APPLICATION_JSON_VALUE
का उपयोग करती है, जैसा कि यहां प्रश्न में है।
// yields: This is a String
System.out.println("This is a String");
// yields: "This is a String"
System.out.println("\"This is a String\"");
पहले उत्पादन JSON के रूप में पार्स नहीं किया जा सकता है, लेकिन दूसरा उत्पादन कर सकते हैं:
यह निम्न के बीच अंतर अनिवार्य रूप से की तरह है।
कुछ '"'+myString+'"'
की तरह कुछ शायद एक अच्छा विचार नहीं है, क्योंकि यह स्ट्रिंग के भीतर डबल-कोट्स के उचित भागने को संभाल नहीं पाएगा और ऐसी किसी भी स्ट्रिंग के लिए वैध JSON का उत्पादन नहीं करेगा।
इसे संभालने का एक तरीका आपकी स्ट्रिंग को ऑब्जेक्ट या सूची के अंदर एम्बेड करना होगा, ताकि आप वसंत में कच्ची स्ट्रिंग नहीं पार कर सकें। हालांकि, यह आपके आउटपुट के प्रारूप को बदलता है, और वास्तव में कोई अच्छा कारण नहीं है कि एक उचित-एन्कोडेड JSON स्ट्रिंग को वापस करने में सक्षम न हो, यदि आप यही करना चाहते हैं। यदि आप यही चाहते हैं, तो इसे संभालने का सबसे अच्छा तरीका एक JSON फ़ॉर्मेटर के माध्यम से Json या Google Gson है। यहां बताया गया है कि यह जीसन के साथ कैसे दिख सकता है:
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"));
}
}
यह या तो काम नहीं करता है। मुझे कुछ भी जांचने की ज़रूरत है? – Sydney
जो सबसे निश्चित रूप से काम करता है ... आपको एक प्रतिक्रिया के रूप में क्या मिलता है, और आपको वास्तव में क्या चाहिए? – NimChimpsky
मुझे 'यह एक स्ट्रिंग' मिलता है और यदि मैं कोई ऑब्जेक्ट देता हूं तो मुझे '{" दोहराना ": 15}' मिलता है। तो आदिम के लिए, ऐसा लगता है कि मुझे JSON स्ट्रिंग नहीं मिलती है, लेकिन ऑब्जेक्ट के लिए मैं करता हूं। – Sydney