2011-01-18 16 views
16

मैं उत्कृष्ट Json.Net पुस्तकालय का उपयोग कर रहा मेरी संस्थाओं इकाई की रूपरेखा द्वारा उत्पन्न क्रमानुसार करने serializing। मैं ऐसा करने के लिए निम्न कोड का उपयोग करें:Json.Net अनपेक्षित वर्ण ("") जब मेरे संस्थाओं (इकाई की रूपरेखा)

using (MyVoucherEntities context = new MyVoucherEntities()) 
{ 
    List<MyObject> list = context.MyObjects.ToList(); 
    string json = JsonConvert.SerializeObject(list); 
} 

सब कुछ चला जाता है अच्छी तरह से मेरा मतलब है, वस्तुओं को सही ढंग से एक थिंक छोड़कर क्रमानुसार लगे हुए हैं: यह वर्ण से बचें कहते हैं, "\" है कि जब ग्राहक के पक्ष deserializing मुझे बुरा सपना हो रही बनाता है।

[ 
    { 
     \"$id\": \"1\", 
     \"CreationDate\": \"\\\/Date(1293186324257+0000)\\\/\", 
     \"ImageUrl\": \"http:\/\/www.google.com\", 
     \"Title\": \"Here is a title\" 
    } ] 

क्या कोई जानता है कि मैं इन भागने वाले पात्रों से क्यों और कैसे छुटकारा पा सकता हूं "\"?

+0

@ जोन स्कीट संभावित रूप से सही है, क्या समस्याएं हैं या त्रुटि संदेश जब आप deserializing हो रहा है? – PsychoCoder

+0

deserialising के साथ मुद्दा बचने के पात्रों (\) के कारण नहीं है, लेकिन इस तथ्य के कारण कि धारावाहिक पाठ "[" के साथ शुरू होता है और "]" के साथ समाप्त होता है। @ जोन पोल्वोरा का जवाब देखें। यदि आप अपना सीरियलाइज्ड टेक्स्ट {"डमी रूट" के साथ जोड़ते हैं: और संलग्न करें} तो आप पाएंगे कि यह ठीक है। – ajgreyling

उत्तर

13

ठीक है मुझे कारण है कि मैंने अपनी स्ट्रिंग ("\") में वर्णों से बचने का कारण क्यों पाया ... मेरी ऑब्जेक्ट्स को क्रमबद्ध करने के बाद, मैं डब्ल्यूसीएफ के माध्यम से क्लाइंट ऐप में जेसन स्ट्रिंग लौट रहा हूं। जाहिर है, नेटवर्क पर भेजने से पहले WCF स्ट्रिंग में इन वर्णों को स्वचालित रूप से जोड़ रहा है। यह एक डिफ़ॉल्ट व्यवहार है और स्पष्ट रूप से अनिवार्य है।

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

आपकी मदद के लिए Thx @ जोन स्कीट और @ क्रिस!

+0

बह! आपने विशेष रूप से कहा है कि यह क्रमबद्धता में उन्हें जोड़ रहा था! खुशी है कि आप इसे ठीक हो गया है। :) और आप उन उत्तरों को +1 कर सकते हैं जिन्हें आपको उपयोगी पाया गया है, हालांकि मुझे याद नहीं है कि आप इसे अपने प्रतिनिधि के स्तर पर कर सकते हैं ... – Chris

+7

वास्तविक कारण यह है कि आपको बचने वाले पात्र मिल रहे हैं क्योंकि आप मैन्युअल रूप से अपने वापसी मूल्य को क्रमबद्ध कर रहे हैं _and_ डब्ल्यूसीएफ अपने प्राकृतिक व्यवहार के हिस्से के रूप में आपके (पहले से ही क्रमबद्ध) वापसी मूल्य को क्रमबद्ध कर रहा है। तो JSON इसमें भागने के पात्रों के साथ समाप्त होता है। एक धारा के रूप में लौटने से आप डब्ल्यूसीएफ धारावाहिक के आसपास प्रभावी ढंग से अंत कर रहे हैं। एक अन्य संभावित समाधान है कि आप अपनी विधि से गैर-धारावाहिक वस्तु को वापस कर दें और डब्ल्यूसीएफ को इसे क्रमबद्ध करें, लेकिन इसका मतलब है जेसन.Net का उपयोग नहीं करना। –

+0

@ ब्रायन - आप सही हैं। मुझे यह वही समस्या है, लेकिन यह कष्टप्रद है क्योंकि मैं एक कस्टम कनवर्टर चाहता हूं जिसका उपयोग केवल नियंत्रक द्वारा किया जाता है (इसलिए, मैं वर्ग को "इस कस्टम कनवर्टर के साथ हमेशा क्रमबद्ध करने" कहने के लिए एनोटेट नहीं कर सकता। अगर मैं उपयोग करता हूं नियंत्रक तर्क में कस्टम कनवर्टर, मैं एक स्ट्रिंग वापस करता हूं और फिर डब्ल्यूसीएफ डेटा को फिर से क्रमबद्ध करता है ... – Jmoney38

21

मुझे संदेह है कि यह वास्तव में से बचने वाले वर्ण जोड़ना नहीं है। मुझे लगता है तुम सिर्फ एक डीबगर में स्ट्रिंग पर देख रहे हैं, और कि एस्केपिंग जोड़ने है।

एक फ़ाइल या कंसोल के लिए यह डंपिंग की कोशिश करो।

+0

एक फॉर्म टेक्स्ट बॉक्स पर डंपिंग भी मेरे लिए काम किया। महान टिप धन्यवाद –

1

मैं नोट करना चाहिए कि आप पूरी तरह से outputted सामान उद्धृत नहीं किया है कि (मैं यूआरएल अपने जवाब में काम करने के लिए मिला - कि अपने प्रश्न में के बजाय संपादित किया जाना चाहिए था एक जवाब के रूप में डाल दिया)। स्ट्रिंग मैं एक फ़ाइल में वापस मिल इस था:

"[{\"$id\":\"1\",\"CreationDate\":\"\\\/Date(1293186324257+0000)\\\/\",\"ImageUrl\":\"http:\/\/www.c-tina.com\/MyVoucherAdmin\/Images\/shop22\/burger.jpg\",\"Title\":\"Get one burger for free\",\"Description\":\"Bla lbzlfpzkfgmzke\\rdmjdgmj\\r\\r\\rlgfpzkegmkzepk\",\"ShopId\":22,\"PromotionId\":15,\"Shop\":null,\"Features\":[],\"SingleStats\":[],\"WhatsHots\":[],\"EntityKey\":{\"$id\":\"2\",\"EntitySetName\":\"Promotions\",\"EntityContainerName\":\"MyVoucherEntities\",\"EntityKeyValues\":[{\"Key\":\"PromotionId\",\"Type\":\"System.Int32\",\"Value\":\"15\"}]}}]" 

मुझे करने के लिए महत्वपूर्ण बात यह है कि आगे और अंत जो मुझे लगता है कि जो कुछ भी यह outputting है बनाता है पर नहीं छोड़ा जाएगा उद्धरण देखते हैं यह उद्धृत किए जाने की आवश्यकता यह तय करना है कि है और यदि आप उद्धरणों में इसके आस-पास हैं तो आप इसके अंदर मौजूद उद्धरणों से बचने के लिए आह्वान करते हैं।

पूर्ण आउटपुट को देखकर यह कहने में कठिनाई होती है कि समस्या टीएच कोड में है या नहीं, आपने जेएसओएन उत्पन्न करने के लिए ऊपर उद्धृत किया है या अगर इसे संसाधित करने के बाद के चरण में कोई समस्या है जो उद्धरण का कारण बन रहा है। आप डिबग और पाया कि आपका serialize कॉल के उत्पादन में निश्चित रूप से भाग निकले संस्करण का निर्माण कर रहा है बजाय यह बाद के चरण संभवतः में किया जा रहा है? आप डीबगर करने के लिए इस्तेमाल नहीं कर रहे हैं तो जॉन स्कीट के पर ध्यान देना यह फाइल करने के लिए डंपिंग या कंसोल यकीन है कि कोई भ्रम है कि जिस तरह से है बनाने के लिए की सुझाव देते हैं।

+0

क्रिस, thx आपके उत्तर के लिए। मैंने डीबगर के साथ सत्यापित किया और वास्तव में, क्रमिक क्रम में उद्धरण जोड़ना, बाद के चरण में नहीं। फिर भी, मैंने एक अन्य प्रोजेक्ट में एक ही कोड की कोशिश की और किसी कारण से मुझे नहीं पता, यह उद्धरण नहीं जोड़ता है ... क्या यह उस ऑब्जेक्ट का प्रकार हो सकता है जिसे मैं क्रमबद्ध कर रहा हूं जो जेसन द्वारा इन उद्धरणों का उत्पादन करता है। नेट लाइब्रेरी? – Renaud

+0

मैंने वास्तव में जेसननेट लाइब्रेरी का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि मैं और सलाह प्रदान कर सकता हूं। आप उन ऑब्जेक्ट्स में अलग-अलग ऑब्जेक्ट्स और अलग-अलग डेटा के साथ कोशिश कर सकते हैं ताकि यह देखने में कोई फर्क पड़ता है। मैं थोड़ा सा स्टंप हूं कि ऐसा क्यों होगा, हालांकि, मैं किसी भी परिस्थिति के बारे में सोच नहीं सकता जिसमें आप इसे कभी चाहें। ब्याज से बाहर यदि आप इसे सीधे desh deserialise विधि के माध्यम से चलाते हैं तो यह अपेक्षा के अनुसार काम करता है? बेवकूफ सोच रहा है कि यहां कुछ प्रकार की बग हो सकती है .. – Chris

1

क्या यह मदद करता है? मैं अपने WebService में इसका इस्तेमाल किया Json सामग्री वापस करने के लिए:

private HttpContent ConvertToJsonContent(object content) 
{ 
    string jsonObject = JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented); 
    return new StringContent(jsonObject, Encoding.UTF8, "application/json"); 
} 

तो तार एक "\" दो "\\" वापस आ जाएगा। आप unescape

private HttpContent ConvertToJsonContent(object content) 
{ 
    string jsonObject = Regex.Unescape(JsonConvert.SerializeObject(content, Newtonsoft.Json.Formatting.Indented)); 
    return new StringContent(jsonObject, Encoding.UTF8, "application/json"); 
} 
+0

जबकि अन्य उत्तरों ने अच्छे जवाब दिए * क्यों * पात्र बच नहीं रहे थे, यूनेस्केप समाधान एक त्वरित था और एक समान समस्या से निपटने के लिए अच्छा समाधान। – Cantalouping

2

यह अमान्य JSON है क्योंकि वस्तुओं की एक सूची serializing का परिणाम एक सरणी है, यानी है का उपयोग करके इस से बच सकते हैं, json के साथ एक '[' और के साथ एक न खत्म होने वाली ']' शुरू कर देंगे। इसे ठीक करने के लिए, आपको किसी ऑब्जेक्ट (किसी वर्ग या अज्ञात ऑब्जेक्ट का कोई उदाहरण) में ऑब्जेक्ट्स की सूची को लपेटने की आवश्यकता है, इसलिए परिणामस्वरूप स्ट्रिंग '{' और '} के साथ समाप्त' के साथ शुरू होगी। उदाहरण के लिए: var output = new List<object>(); var json = JsonConvert.SerializeObject(new { root = output }, Formatting.Indented); Response.Write(json);

+0

सुरुचिपूर्ण! कोई व्यक्ति इस {c = कार्यक्षमता को नए {x = y} के साथ बनाने की कार्यक्षमता कहता है। मैंने इसे कन्स्ट्ररलेस इंस्टेंटिएटिंग के लिए उपयोग किया है, लेकिन ऐसा नहीं। – ajgreyling

+0

हाँ, यह है जिसे अज्ञात प्रकार सी # कहा जाता है, बहुत उपयोगी होता है जब आप सामान्य "नामित" कक्षा को इस तरह के एक साधारण कार्य के लिए नहीं बनाना चाहते हैं। –