दिलचस्प पोस्ट
विंडोज हैंडल क्या है? IQueryable लौटने के लिए <T> या वापस नहीं IQueryable <T> यूआरएल में, क्या रिक्त स्थान को% 20 या + का उपयोग करके एन्कोड किया जाना चाहिए? JSON में RestTemplate के माध्यम से पोस्ट अनुरोध मैं एक बटन समूह से कौन से JRadioButton का चयन कर सकता हूं SQL सर्वर में दिनांक स्वरूप डीडी / एमएमएम / वाई वाई वाई वाई प्रारूप में कनवर्ट करें वर्तमान में मेरे एप्लिकेशन पर चल रहे एंड्रॉइड एपीआई स्तर का फोन प्राप्त करें रेज़र व्यूइंजिन एचटीएमएल। चेकबॉक्स विधि छिपी इनपुट बनाता है क्यूं कर? सैमसंग गैलेक्सी एस 7 (कैमरा 2) पर YUV_420_888 व्याख्या सी # सूची <> क्रमशः x और y वीएस 2005 में एक बड़े C ++ अनुप्रयोग के लिए कड़ी प्रदर्शन को कैसे सुधारें "पीआईएमपीएल" मुहावरों को क्यों इस्तेमाल किया जाना चाहिए? क्यों एक onclick संपत्ति setAttribute के साथ स्थापित करता है IE में काम करने में विफल? मैं प्रोग्राम को कई लाइनों में लेआउट में एक-एक करके बटन कैसे जोड़ूं? कोणीय 2 | निर्देश '{}' का तर्क तर्कसंगत नहीं है

JSON ऑब्जेक्ट्स पर __प्रकार संपत्ति को क्रमबद्ध नहीं कैसे करें

एक ScriptService WebMethod से मैं वापस आने वाले प्रत्येक ऑब्जेक्ट को एक JSON ऑब्जेक्ट में ScriptService , जिसमें डेटा के नाम से डेटा d । ठीक है। लेकिन मैं ग्राहक के लिए अतिरिक्त __type गुण की सेवा नहीं चाहता, क्योंकि मैं jQuery के साथ मैन्युअल प्रसंस्करण करता हूं।

क्या यह संभव है?

Solutions Collecting From Web of "JSON ऑब्जेक्ट्स पर __प्रकार संपत्ति को क्रमबद्ध नहीं कैसे करें"

खैर, जब से आपने पूछा तो यह काफी समय हो गया है। मुझे पता चला कि अगर मैं अपने वर्ग के डिफॉल्ट कन्स्ट्रक्टर को बना देता हूं कि मेरी वेबमाथ जनता के अलावा कुछ भी रिटर्न करती है तो यह __प्रकार: क्लासनाम का भाग नहीं होगा।

आप अपना डिफ़ॉल्ट कन्स्ट्रक्टर protected internal ClassName(){} को घोषित करना चाहें protected internal ClassName(){}

जॉन का समाधान मेरे लिए काम नहीं करता क्योंकि मैं जिस प्रकार से लौट रहा हूं वह अलग डीएलएल में है। मेरे पास उस डीएलएल पर पूरा नियंत्रण है, लेकिन मैं अपने वापसी प्रकार का निर्माण नहीं कर सकता यदि कन्स्ट्रक्टर आंतरिक है (निश्चित रूप से)।

मुझे आश्चर्य है कि अगर पुस्तकालय में एक सार्वजनिक प्रकार का वापसी प्रकार भी कारण हो सकता है; जैसा कि मैं कहता हूं कि मैं बहुत अजाक्स कर रहा हूं और इस एक से पहले नहीं देखा है।

त्वरित परीक्षण:

  • अस्थायी रूप से एपकोड में वापसी प्रकार की घोषणा को स्थानांतरित कर दिया। अभी भी __ टाइप करें serialized

  • ठीक है और संरक्षित आंतरिक निर्माता प्रति जेएम लागू यह काम किया (इसलिए उसे एक वोट मिला)।

अजीब तरह से मुझे एक सामान्य वापसी प्रकार के साथ __प्रकार नहीं मिलता है:

 [WebMethod] public static WebMethodReturn<IEnumerable<FleetObserverLiteAddOns.VehicleAddOnAccountStatus>> GetAccountCredits() 

हालांकि मेरे लिए समाधान , डीएलएल में मेरा वापसी प्रकार छोड़ना था, लेकिन वेबमथ रिटर्न टाइप ऑब्जेक्ट में बदलना था , अर्थात

 [WebMethod] public static object ApplyCredits(int addonid, int[] vehicleIds) 

के बजाय

 [WebMethod] public static WebMethodReturn ApplyCredits(int addonid, int[] vehicleIds) 

मैं इनमें से कुछ सुझावों को एक .NET 4 WCF सेवा के साथ करने की कोशिश कर रहा हूं, और वे काम नहीं करते – JSON प्रतिक्रिया में अभी भी __प्रकार शामिल हैं।

टाइप-इशारा को हटाने के लिए मैंने जिस सबसे आसान तरीके से खोज की है, वह है कि enableWebScript से webHttp के अंत बिंदु व्यवहार को बदलना है।

  <behavior name="MapData.MapDataServiceAspNetAjaxBehavior"> <webHttp /> </behavior> 

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

यदि आप सर्विस स्टैक का उपयोग कर रहे हैं। पाठ JSON Serializer आपको बस निम्न की आवश्यकता है:

 JsConfig.ExcludeTypeInfo = true; 

इस कार्यक्षमता को v2.28 में स्वचालित रूप से जोड़ा गया था, लेकिन ऊपर दिए गए कोड को सीरियललाइज़ेशन से बाहर रखा गया है। आप इस Type साथ इस व्यवहार को भी बदल सकते हैं:

 JsConfig<Type>.ExcludeTypeInfo = true; 

JavaScriptTypeResolver और __प्रकार के लिए रिक्त पास में क्रमबद्ध नहीं किया जाएगा

 JavaScriptSerializer serializer = new JavaScriptSerializer(null); string json = serializer.Serialize(foo); 

मुझे यकीन नहीं है कि यह एक अच्छा समाधान है, लेकिन अगर आप जेसनएनएनटी लाइब्रेरी का इस्तेमाल करते हैं, तो आप [जेएसएनआईग्नोर] विशेषता को जोड़कर कुछ गुणों को नजरअंदाज कर सकते हैं।

अपने डेटाकॉन्ट्रक्ट वर्ग में आंतरिक या संरक्षित आंतरिक निर्माता पर जॉन मॉरिसन की सलाह के अतिरिक्त, जो वेब सेवाओं और डब्लूसीएफ के बहुमत के लिए अच्छी तरह से काम करता है, आपको अपने वेब। कॉन्फिग फ़ाइल में एक अतिरिक्त बदलाव करने की आवश्यकता हो सकती है। अपने endpointBehaviors के लिए <enableWebScript/> तत्व का उपयोग करें <webHttp/> के बजाय, जैसे:

 <endpointBehaviors> <behavior name="MyServiceEndpoint"> <webHttp/> </behavior> </endpointBehaviors> 

धागा को थोड़ा देर हो चुकी है लेकिन यहाँ जाता है

हमारे पास एक ही समस्या थी जब संपत्ति जेसन स्ट्रिंग में जोड़ा जा रही थी, वह सूची <T> थी। हमने जो कुछ किया था वह एक और संपत्ति जो कि टी की एक सरणी थी, कुछ जैसे

इससे पहले कि।

 [DataMember] public List<Person> People { get; set; } 

बाद।

 public List<Person> People { get; set; } [DataMember(Name = "People")] public Person[] Persons { get { return People.ToArray(); } private set { } } 

जबकि एक आदर्श समाधान नहीं है, यह चाल करता है

मुझे लगता है कि मैंने रहस्यमय दिखने वाले "__प्रकार" के मूल कारण को संकुचित कर दिया है!

यहां एक उदाहरण दिया गया है, जहां आप इस मुद्दे को पुनः निर्मित कर सकते हैं।

 [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] [System.Web.Script.Services.ScriptService] public class Test : System.Web.Services.WebService { public class Cat { public String HairType { get; set; } public int MeowVolume { get; set; } public String Name { get; set; } } [WebMethod] public String MyMethodA(Cat cat) { return "return value does not matter"; } [WebMethod] public Cat MyMethodB(String someParam) { return new Cat() { HairType = "Short", MeowVolume = 13, Name = "Felix the Cat" }; } } 

यहाँ महत्वपूर्ण हिस्सा है!

बस क्योंकि MyMethodA () इस समान फ़ाइल में मौजूद है। क्लास कैट पैरामीटर के रूप में लेता है …. अन्य विधियों को कॉल करने से वापस __प्रकार को JSON में जोड़ा जाएगा: MyMethodB ()

हालांकि वे विभिन्न तरीकों हैं !!

मेरा सिद्धांत इस प्रकार है:

  1. जब इस तरह वेब सेवाओं को लिखते हैं, तो माइक्रोसॉफ्ट के कोड आपके लिए जेएसओएन सीरियललाइज़िंग / डिसेराइलाइजिंग व्यवहार को स्वचालित रूप से हुक कर लेते हैं क्योंकि आपने [वेबएमिडे] और [स्क्रिप्टस्वायर] जैसी सही विशेषताओं का इस्तेमाल किया है।
  2. जब यह ऑटो-मैजिक माइक्रोसॉफ्ट कोड निष्पादित करता है, तो यह एक ऐसा तरीका पाता है जो कैट क्लास में पैरामीटर के रूप में लेता है।
  3. यह आंकड़े … ओह … ठीक है …. ठीक है क्योंकि मुझे एक बिल्ली ऑब्जेक्ट JSON से प्राप्त होगा …. इसलिए … अगर मैं कभी भी वर्तमान वेब सेवा में किसी भी विधि से JSON के रूप में एक बिल्ली ऑब्जेक्ट वापस वर्ग … मैं इसे एक __ टाइप गुण दे दूँगा, इसलिए बाद में पहचानने में आसान होगा जब सी # पर वापस जाने के लिए deserializing।
  4. Nyah-हाहाहाहा …

महत्वपूर्ण ले-एवे नोट

आप अपने वेब जेब में अपनी किसी भी वेबमाप्शन के पैरामीटर के रूप में प्रश्न (मेरे मामले में कैट) को लेकर सवाल उठाने से बचकर अपने जेनरेट किए गए जेएसओएस में __प्रकार संपत्ति दिखाई देने से बच सकते हैं। इसलिए, उपरोक्त कोड में, बस बिल्ली पैरामीटर को निकालने के लिए MyMethodA () को संशोधित करने का प्रयास करें। इसके कारण __प्रकार संपत्ति उत्पन्न नहीं होती है।

[Serializable] विशेषता का उपयोग न करें

निम्नलिखित को यह करना चाहिए

JavaScriptSerializer ser = नया JavaScriptSerializer (); स्ट्रिंग json = ser.Serialize (objectClass);

इसे हल करना चाहिए

System.WebExtensions.dll में JavaScriptSerializer के निजी SerializeValue विधि में, __ टाइप एक आंतरिक शब्दकोश में जोड़ा जाता है यदि यह हल किया जा सकता है।

रिफ्लेक्टर से:

 private void SerializeValue(object o, StringBuilder sb, int depth, Hashtable objectsInUse) { if (++depth > this._recursionLimit) { throw new ArgumentException(AtlasWeb.JSON_DepthLimitExceeded); } JavaScriptConverter converter = null; if ((o != null) && this.ConverterExistsForType(o.GetType(), out converter)) { IDictionary<string, object> dictionary = converter.Serialize(o, this); if (this.TypeResolver != null) { string str = this.TypeResolver.ResolveTypeId(o.GetType()); if (str != null) { dictionary["__type"] = str; } } sb.Append(this.Serialize(dictionary)); } else { this.SerializeValueInternal(o, sb, depth, objectsInUse); } } 

यदि प्रकार निर्धारित नहीं किया जा सकता है, तो क्रमिकरण जारी रहेगा, लेकिन इस प्रकार को अनदेखा कर दिया जाएगा। अच्छी खबर यह है कि चूंकि गुमनाम प्रकार बीटाटाइप () प्राप्त करते हैं और वापस आने वाले नामों को डायनामिक रूप से कंपाइलर द्वारा उत्पन्न किया जाता है, तो TypeResolver ResolveTypeId के लिए रिक्त देता है और "__प्रकार" विशेषता को बाद में अनदेखा कर दिया जाता है।

मैं सिर्फ जॉन मैरिसन की आंतरिक रचनाकार के साथ सलाह लेता हूं, हालांकि इस विधि का उपयोग करते हुए, मैं अभी भी अपने JSON प्रतिक्रिया में __ टाइप गुण प्राप्त कर रहा था।

 //Given the following class [XmlType("T")] public class Foo { internal Foo() { } [XmlAttribute("p")] public uint Bar { get; set; } } [WebService(Namespace = "http://me.com/10/8")] [System.ComponentModel.ToolboxItem(false)] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [ScriptService] public class MyService : System.Web.Services.WebService { //Return Anonymous Type to omit the __type property from JSON serialization [WebMethod(EnableSession = true)] [System.Web.Script.Services.ScriptMethod(UseHttpGet = false, ResponseFormat = ResponseFormat.Json, XmlSerializeString = false)] public object GetFoo(int pageId) { //Kludge, returning an anonymois type using link, prevents returning the _type attribute. List<Foo> foos = new List<Foo>(); rtnFoos.Add( new Foo(){ Bar=99 }}; var rtn = from g in foos.AsEnumerable() select g; return rtn; } } 

नोट: मैं एक वंशानुक्रमित JSON प्रकार कनवर्टर का उपयोग कर रहा हूं जो कि सीरियल किए गए प्रकारों से एक्सएमएल सीरियललाइजेशन विशेषताओं को JSON को और अधिक सम्मिलित करता है। CodeJournal के लिए धन्यवाद के साथ एक जादू की तरह काम करता है।

मेरे 2 सेंट, हालांकि दिन में देर हो चुकी है: जैसा कि दूसरों ने उल्लेख किया है, "__प्रकार" संपत्ति को रोकने के लिए दो तरीके हैं:

क) पैरालेसलेस कन्स्ट्रक्टर को सुरक्षित रखें

ख) एक वेब विधि के लिए पैरामीटर के रूप में क्लास को पास करने से बचें

यदि आपको क्लास को एक पैरामीटर के रूप में पास करने की आवश्यकता नहीं है तो आप कन्स्ट्रक्टर "संरक्षित आंतरिक" बना सकते हैं। यदि आपको खाली वस्तु बनाने की आवश्यकता है तो डमी पैरामीटर के साथ किसी कारखाने विधि या किसी अन्य निर्माता में जोड़ें।

हालांकि, यदि आपको वेब विधि के लिए एक पैरामीटर के रूप में क्लास को उत्तीर्ण करने की आवश्यकता है तो आपको पता चल जाएगा कि यह काम नहीं करेगा यदि पैरासेलेबल कन्स्ट्रक्टर संरक्षित है (एजेक्स कॉल विफल रहता है, संभवतः जैसा कि जेएसएन डेटा में पारित किया गया है, उसे आपके क्लास में डिसेरीलाइज़ नहीं किया जा सकता है )।

यह मेरी समस्या थी, इसलिए मुझे (ए) और (बी) के संयोजन का उपयोग करना था: पैरासेलेबल कन्स्ट्रक्टर की रक्षा करना और वेब विधियों के मापदंडों के लिए विशेष रूप से उपयोग किए जाने वाले डमी व्युत्पन्न वर्ग बनाना। उदाहरण के लिए:

 public class MyClass { protected internal MyClass() { } public MyClass(Object someParameter) { } ... } // Use this class when we need to pass a JSON object into a web method public class MyClassForParams : MyClass { public MyClassForParams() : base() { } } 

MyClass में किसी भी वेब विधि को लेने की आवश्यकता है तो इसके बजाय MyClassForParams का उपयोग करता है:

 [WebMethod] [ScriptMethod(ResponseFormat = ResponseFormat.Json)] public MyClass DoSomething(MyClassForParams someObject) { // Do something with someObject ... // Maybe return a MyClass object ... } 

यह एक हैक का एक सा है, लेकिन यह मेरे लिए काम किया (सी # का उपयोग कर रहा है):

 s = (JSON string with "__type":"clsname", attributes) string match = "\"__type\":\"([^\\\"]|\\.)*\","; RegEx regex = new Regex(match, RegexOptions.Singleline); string cleaned = regex.Replace(s, ""); 

[DataContract] और [DataContract(Namespace="")] दोनों के साथ काम करता है