6

नाकाम रहने मैं एक js वस्तु की तरह संरचित है:JavaScriptSerializer deserialize वस्तु "संग्रह" के रूप में वस्तु में संपत्ति

object.property1 = "some string"; 
object.property2 = "some string"; 
object.property3.property1 = "some string"; 
object.property3.property2 = "some string"; 
object.property3.property2 = "some string"; 

मैं ajax अनुरोध के साथ यह पारित करने के लिए JSON.stringify (वस्तु) का उपयोग कर रहा हूँ। जब मैं जावास्क्रिप्टसेरियलज़र का उपयोग करके इसे deserialize करने की कोशिश करता हूं। मुझे एक शब्दकोश के रूप में परिभाषित करें, मुझे निम्न त्रुटि मिलती है:

'सिस्टम.स्ट्रिंग' के प्रकार के लिए कोई पैरामीटर रहित कन्स्ट्रक्टर परिभाषित नहीं किया गया है।

यह सटीक प्रक्रिया नियमित वस्तु के लिए गैर "संग्रह" गुणों के साथ काम कर रही है .. किसी भी मदद के लिए धन्यवाद!

उत्तर

9

ऐसा इसलिए है क्योंकि deserializer को उप-ऑब्जेक्ट को संभालने का तरीका नहीं पता है। क्या आप जे एस में है यह है:

var x = { 
    'property1' : 'string', 
    'property2' : 'string', 
    'property3' : { p1: 'string', p2: 'string', p3: 'string' }, 
}; 

जो सी # में कुछ वैध करने के लिए एक नक्शा नहीं है:

HashTable h = new HashTable(); 
h.Add("property1", "string"); 
h.Add("property2", "string"); 
h.Add("property3", ???); 

??? ऐसा इसलिए है क्योंकि यहां कोई प्रकार परिभाषित नहीं किया गया है, तो deserializer कैसे पता चलेगा कि आपके जेएस में अज्ञात वस्तु क्या दर्शाती है?

संपादित

आप यहाँ क्या पूरा करने के लिए कोशिश कर रहे हैं करने के लिए कोई तरीका नहीं है। आपको अपना ऑब्जेक्ट टाइप करना होगा। उदाहरण के लिए, अपनी कक्षा को इस तरह परिभाषित करना:

class Foo{ 
    string property1 { get; set; } 
    string property2 { get; set; } 
    Bar property3 { get; set; } // "Bar" would describe your sub-object 
} 

class Bar{ 
    string p1 { get; set; } 
    string p2 { get; set; } 
    string p3 { get; set; } 
} 

... या उस प्रभाव के लिए कुछ।

{ "field1" : "value", "data" : { "foo" : "bar" } } 

मैं मूल रूप से एक स्ट्रिंग के रूप में डेटा फ़ील्ड था वस्तुओं के लिए MSDN पर निर्दिष्ट के रूप में जब यह एक Dictionary<string, string> किया गया है चाहिए:

+0

यह मेरे मूल प्रश्न का एक बड़ा विस्तार है .. क्या आपके पास कोई जवाब है? धन्यवाद! – bill

+0

ठीक है जो समझ में आता है और सबसे आसान है .. एक बार मैंने उन्हें टाइप किया है कि मैं पूरी चीज़ को फिर से कैसे बेकार कर सकता हूं? – bill

+1

मैं जावास्क्रिप्टसेरियलाइज़र से परिचित नहीं हूं, लेकिन मुझे अनुमान है: Foo foo = जावास्क्रिप्टसेरियलाइज़र। (आने वाली जेसन); – jvenema

0

एक अधिक सामान्य जवाब के रूप में, मेरे मामले में मैं वस्तुओं की तरह देखा था जो शब्दकोश वाक्यविन्यास का उपयोग करें।

public class Message 
{ 
    public string field1 { get; set; } 

    public Dictionary<string, string> data { get; set; } 
} 
संबंधित मुद्दे