2011-12-12 19 views
6

से मिलान करने के लिए JSON स्ट्रिंग को सीरियलाइज करना मुझे डब्ल्यूसीएफ फ़ंक्शन कॉल के पैरामीटर नाम से मिलान करने के लिए JSON में ऑब्जेक्ट को क्रमबद्ध करने में समस्या का सामना करना पड़ रहा है। समस्या पैरामीटर नाम को मैप करना है, यानी आने वाली JSON स्ट्रिंग में प्रारंभिक मान होना चाहिए जैसा फ़ंक्शन में पारित पैरामीटर के समान है।डब्ल्यूसीएफ सेवा फ़ंक्शन पैरामीटर

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}" 

यह मेरा WCF समारोह जो मैं अपने ग्राहक में और के रूप में आप पैरामीटर नाम देख सकते हैं फोन है जो वापस आ जा रही है "GetComplexDataResult"

[OperationContract] 
[WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)] 
String SaveData(CompositeType GetComplexDataResult); 

समस्या जो होता है के रूप में ही है जब मैं या तो माइक्रोसॉफ्ट System.Web.Script.Serialization.JavaScriptSerializer या किसी अन्य पुस्तकालय (जैसे Json.NET)

यह केवल मुझे रिटर्न {\"BoolValue\":true,\"StringValue\":\"Hello World!\"} भले ही मैं एक ही कक्षा "CompositeType" की एक वस्तु पारित उपयोग करते हुए मेरे वस्तु क्रमानुसार करने की कोशिश (यह ग्राहक के पक्ष कोड है) उदाहरण के लिए

CompositeType GetComplexDataResult= new CompositeType(); 
GetComplexDataResult.BoolValue = true; 
GetComplexDataResult.StringValue = "Hello World"; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
string json = serializer.Serialize(patchVersion); 

मेरे सवाल यह है कि मैं सिर्फ JSON पार्सर के लिए मेरी वस्तु पारित करके इस JSON स्ट्रिंग

{\"BoolValue\":true,\"StringValue\":\"Hello World!\"} 
साथ

के बजाय

"{\"GetComplexDataResult\":{\"BoolValue\":true,\"StringValue\":\"Hello World!\"}}" 

मिल सकता है। मैं अपने JSON स्ट्रिंग जेनरेट करने के बाद इसे मैन्युअल रूप से जोड़ सकता हूं, लेकिन यह बहुत अधिक समय लेने वाला काम होगा। क्या कोई पार्सर है जो इस समस्या को हल करता है।

उत्तर

3

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

string json = serializer.Serialize(new { GetComplexDataResult = patchVersion}); 

, अगर आप परवाह नहीं है पैरामीटर नाम बिल्कुल JSON में शामिल है या नहीं, आप BodyStyleBodyStyle = WebMessageBodyStyle.Bare करने के लिए सेट कर सकते हैं: इस प्रयास करें।

+0

बहुत बहुत धन्यवाद यह मेरे लिए काम किया। – adnangohar

1

मैंने जो भी JSON पार्सर देखा है - ऑब्जेक्ट प्रकार JSON में कभी भी शामिल नहीं है। क्रमबद्धता उस वस्तु के एक उदाहरण का प्रतिनिधित्व करती है। यदि आपको ऑब्जेक्ट स्रोत प्रकार संदर्भ जानने की आवश्यकता है तो आप type विशेषता जोड़ने से बेहतर होंगे। {\"BoolValue\":true,\"StringValue\":\"Hello World!\",\"type\":\"GetComplexDataResult\"}

आपका आउटपुट मुझे एक SOAP लिफाफा की याद दिलाता है। आपको encapsulation की आवश्यकता नहीं है - यह सिर्फ इसे और अधिक जटिल बनाता है। JSON सरल है - इसे सरल रखें।

+0

जेनरेट जेएसओएन की शुरुआत में ऑब्जेक्ट नाम "GetComplexDataResult" जोड़ने के बारे में यहां समस्या नहीं है। जेएसओएन स्ट्रिंग से डब्ल्यूसीएफ मानचित्र नाम और आपके द्वारा कार्य किए गए पैरामीटर। डब्ल्यूसीएफ जेसन प्रतिक्रिया इस तरह है, "{\" GetComplexDataResult \ ": {\" BoolValue \ ": true, \" StringValue \ ": \" हैलो वर्ल्ड! \ "}}" और जैसा कि मैं इसे प्राप्त कर एक फ़ंक्शन कॉल कर रहा हूं स्वचालित रूप से फ़ंक्शन नाम "GetComplexData" और अतिरिक्त "परिणाम" विशेषता को जोड़ता है। तो, मैं सोच रहा था कि ऐसा करने के आसपास एक तरीका हो सकता है क्योंकि डब्ल्यूसीएफ ऐसा कर रहा है, इसलिए यह संभव होना चाहिए। – adnangohar

2

मेरा सवाल है, क्या आपके पास जेसन डेटा की शुरुआत में \"GetComplexDataResult\" होने की आवश्यकता है?

मुझे विश्वास नहीं है कि जेसन सीरियलाइज़र जो भी आप उन्हें मूल रूप से करना चाहते हैं, आपको बहुत अधिक इसे संभालना होगा।

हम जिस कंपनी के लिए काम करते हैं उसमें हम क्या करते हैं, क्या हम अपना खुद का प्रतिक्रिया रैपर बनाते हैं जो हमारे सभी प्रतिक्रियाओं को हमारे सभी जेसन सेवाओं के लिए समान प्रारूप बनाता है। इतना अधिक हम एक मानक डेटाकंट्रैक्ट करते हैं जो बाहरी आवरण के गुणों में से एक के लिए डेटाकंट्रैक्ट देता है। आप "घोंसले" कार्यक्षमता को पाने के लिए ऐसा कुछ कर सकते हैं जिसे आप ढूंढ रहे हैं।

[DataContract] 
    public class ServiceResult<T> 
    { 
     [DataMember] 
     public T GetComplexDataResult{ get; set; } 
    } 

अद्यतन: इस संशोधित सामान्य होने के

यहाँ एक उदाहरण है। आगे बताना चाहता था कि मैं अपने मूल उत्तर के साथ कहां जा रहा था। दोबारा एड्रिफ्ट का जवाब अधिक संक्षेप में है, अगर आप विस्तार करना चाहते हैं, तो मैसेजिंग जोड़ने की तरह ही ध्यान रखें, आपको ऐसा कुछ करना होगा, या मैन्युअल रूप से इसे स्वयं करना होगा। मुझे वास्तव में यह दृष्टिकोण पसंद है क्योंकि मुझे पता है कि मेरा प्रारूप हमेशा वही होगा जो हमारी डब्ल्यूसीएफ सेवाओं में से कोई भी बात नहीं है।

+0

हां, जैसा कि डब्ल्यूसीएफ मानचित्रों को जेएसओएन स्ट्रिंग में नामों को पारित पैरामीटर के लिए नाम दिया गया है। स्ट्रिंग सेवडाटा (CompositeType GetComplexDataResult) में "GetComplexDataResult" नामक एक पैरामीटर है और इस ऑब्जेक्ट के मान को मैप करने के लिए JSON स्ट्रिंग "{\" GetComplexDataResult \ "होना चाहिए: {\" BoolValue \ ": true, \" StringValue \ ": \" नमस्ते दुनिया!\"}}"। मुझे यह देखने की ज़रूरत है कि मेरी वस्तुओं के चारों ओर एक रैपर बनाने से मुझे कितना मदद मिलेगी। – adnangohar

+0

जैसा कि मैंने नोट किया है, वैसे ही मैं वही काम करता हूं, लेकिन हम इसे सामान्य जेनर सर्विस रीसेट अनुबंध में लपेटते हैं जहां आंतरिक संपत्ति सार्वजनिक है [] डेटा {प्राप्त करें; सेट; }। तो लौटाया गया डेटा हमेशा "डेटा" जेसन में वापस आता है। Adrift द्वारा जवाब अनिवार्य रूप से एक ही बात करता है, आप एक ही परिणाम मिलता है। – Etch

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