2013-08-22 4 views
8

के लिए JSON लौटें मेरे पास मेरे नियंत्रक में एक विधि है जो JSON में एक स्ट्रिंग लौटा देनी चाहिए। यह गैर आदिम प्रकार के लिए JSON देता है:ResponseEntity <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); 
} 

कर्ल प्रतिक्रिया है:

This is a String 

उत्तर

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

यह या तो काम नहीं करता है। मुझे कुछ भी जांचने की ज़रूरत है? – Sydney

+0

जो सबसे निश्चित रूप से काम करता है ... आपको एक प्रतिक्रिया के रूप में क्या मिलता है, और आपको वास्तव में क्या चाहिए? – NimChimpsky

+0

मुझे 'यह एक स्ट्रिंग' मिलता है और यदि मैं कोई ऑब्जेक्ट देता हूं तो मुझे '{" दोहराना ": 15}' मिलता है। तो आदिम के लिए, ऐसा लगता है कि मुझे JSON स्ट्रिंग नहीं मिलती है, लेकिन ऑब्जेक्ट के लिए मैं करता हूं। – Sydney

10

समस्या की जड़ है कि वसंत (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")); 
    } 
} 
+1

यह सही उत्तर है। आपको शायद खुद से पूछना चाहिए कि क्या आपको वास्तव में इस एंडपॉइंट के लिए JSON का समर्थन करने की आवश्यकता है जो केवल एक स्ट्रिंग लौटाएगा। अगर न केवल पाठ/सादे में उत्पादन को बदल दें। – CaptRespect

+0

पिछले के बजाय सही उत्तर के रूप में स्वीकार किया जाना चाहिए –

संबंधित मुद्दे