2012-01-09 7 views
5

के रूप में \ भाग निकले मैं एक विधि है कि जैसे एक json परिणाम लौटने को लागू कर रहा हूँ:कैसे यूनिकोड वर्ण के साथ json परिणाम वापस जाने के लिए u1234

public JsonResult MethodName(Guid key){ 
    var result = ApiHelper.GetData(key); //Data is stored in db as varchar with åäö 
    return Json(new { success = true, data = result },"application/json", Encoding.Unicode, JsonRequestBehavior.AllowGet); 
} 

दिखाया गया है परिणाम:

{"success":true,"data":[{"Title":"Here could be characters like åäö","Link":"http://www.url.com/test",...}, 

लेकिन मैं करूंगा इसे प्रदर्शित करने की तरह:

{"success":true,"data":[{"Title":"Here could be characters like \u00e5\u00e4\u00f6","Link":"http:\/\/www.url.com\/test",...}, 

मैं इसे कैसे पूरा कर सकता हूं? क्या मैं इसे परिवर्तित कर सकता हूं, इसे पार्स कर सकता हूं या प्रतिक्रिया बदल सकता हूं web.config में एन्कोडिंग इसे यूनिकोड वर्ण प्रदर्शित करने के लिए?

+3

क्या आपका मतलब यूटीएफ -8 की बजाय '\ u' से बच निकला है? यूटीएफ -8 यूनिकोड का एक वैध एन्कोडिंग है और आपका ब्राउज़र इसे ठीक समझ जाएगा। आपको '\ u' से बचने की आवश्यकता क्यों है? – Rup

+0

एक तीसरी कंपनी जो हमारे लिए एक आईफोन ऐप विकसित कर रही है, कहती है कि उनके पास इस प्रारूप में होना चाहिए। मुझे नहीं पता कि क्यों एक्स-कोड और टाइटेनियम के साथ कुछ करना था। – Maxelsson

उत्तर

4

क्लाइंट एक वेब ब्राउजर है, या कोई अन्य क्लाइंट जो http को सही तरीके से संभालता है, से बचने की कोई आवश्यकता नहीं है, जब तक कि आपका सर्वर क्लाइंट को सामग्री प्रकार और सामग्री एन्कोडिंग के बारे में सही तरीके से बताता है, और आपके द्वारा चुने गए एन्कोडिंग का समर्थन करता है आउटगोइंग डेटा में कोडपॉइंट्स।

यदि ग्राहक सही तरीके से व्यवहार नहीं करता है, और इसे वास्तव में इस तरह से बचने के लिए तारों की आवश्यकता होती है, तो आपको अपना खुद का ActionResult कक्षा लिखनी होगी और स्वयं से बच निकलना होगा। शुरू करने के लिए JsonResult से इनहेरिट करें, और जेएसओएन दस्तावेज़ बनाने के लिए प्रतिबिंब का उपयोग करें जैसा आपको पसंद है।

यह एक गोर है!

संपादित करें: System.Web.Script.Serialization.JavaScriptSerializer jsonSerializer = नए System.Web: यह आपको

public class MyController : Controller { 
    public JsonResult MethodName(Guid key){ 
     var result = ApiHelper.GetData(key); 
     return new EscapedJsonResult(result); 
    } 
} 

public class EscapedJsonResult<T> : JsonResult { 
    public EscapedJsonResult(T data) { 
     this.Data = data; 
     this.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
    } 

    public override ExecuteResult(ControllerContext context) { 
     var response = context.HttpContext.Response; 

     response.ContentType = "application/json"; 
     response.ContentEncoding = Encoding.UTF8; 

     var output = new StreamWriter(response.OutputStream); 

     // TODO: Do some reflection magic to go through all properties 
     // of the this.Data property and write JSON to the output stream 
     // using the StreamWriter 

     // You need to handle arrays, objects, possibly dictionaries, numbers, 
     // booleans, dates and strings, and possibly some other stuff... All 
     // by your self! 
    } 

    // Finds non-ascii and double quotes 
    private static Regex nonAsciiCodepoints = 
     new Regex(@"[""]|[^\x20-\x7f]"); 

    // Call this for encoding string values 
    private static string encodeStringValue(string value) { 
     return nonAsciiCodepoints.Replace(value, encodeSingleChar); 
    } 

    // Encodes a single character - gets called by Regex.Replace 
    private static string encodeSingleChar(Match match) { 
     return "\\u" + char.ConvertToUtf32(match.Value, 0).ToString("x4"); 
    } 
} 
+0

ठीक है। क्लाइंट एक आईफोन ऐप है जिसे टाइटेनियम के साथ एक और कंपनी द्वारा विकसित किया गया है। तारों और विशेष पात्रों के वास्तविक भागने से सी # में कैसा दिखता है? प्रतिस्थापन काम नहीं करेगा? – Maxelsson

+0

नहीं, यदि आप परावर्तक का उपयोग करते हैं या HtmlEncode या AntiXss लाइब्रेरी को देखने के समान हैं तो मुझे लगता है कि आप देखेंगे कि वे एक समय में इनपुट स्ट्रक्चर को एक वर्ण स्कैन करते हैं और स्ट्रिंगबिल्डर को आउटपुट करते हैं। – Rup

+0

मैंने आपको सही दिशा में शुरू करने के लिए अपना उत्तर अपडेट किया। –

0

भागने के कुछ तरीके हैं, लेकिन उनमें से कोई भी बिल्कुल वही नहीं करता जो आप चाहते हैं (HtmlEncode and UrlEncode) आपको ऐसे बचने के लिए उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन की आवश्यकता होगी।

0

सुनिश्चित नहीं हैं कि शुरू कर दिया है कि अगर यह मदद करता है, लेकिन मैं लाइनों के नीचे का उपयोग करके यूनिकोड वर्ण हो रही थी मिल जाएगा .Script.Serialization.JavaScriptSerializer(); रिटर्न जेसन (जेसनएसरियललाइज़र। क्रमबद्ध करें (प्रमाणीकरण परिणाम);

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