2012-08-14 23 views
6

का उपयोग किए बिना जेएसओएन स्ट्रिंग को सी # में deserialize मैं शेयरपॉइंट में एक सैंडबॉक्स समाधान पर काम कर रहा हूं, महत्वपूर्ण प्रतिबंध (इस प्रश्न के संबंध में) .net 3.5 के उपयोग के कारण और कोई प्रतिबिंब अनुमति नहीं है।प्रतिबिंब


उदाहरण 1

अगर मैं इस तरह एक साधारण वर्ग में JSON स्ट्रिंग के रूप deserialize करने की कोशिश यह ठीक काम करता है:

JSON स्ट्रिंग

{"field":"Picture1","url":"whatever"} 

सी # क्लास

public class PictureSetting 
{ 
    public string field { get; set; } 
    public string url { get; set; } 
} 

उदाहरण 2

लेकिन अगर मैं थोड़ा और अधिक जटिल स्ट्रिंग deserialize करने की कोशिश मैं एक त्रुटि मिलती है:

JSON स्ट्रिंग

{ 
    "Rows": [ 
    { 
     "Columns": [ 
     { 
      "Width": "100" 
     } 
     ] 
    }  
    ] 
} 

सी # वर्गों

internal class PageStructure 
{ 
    public List<StructureElement> Rows { get; set; } 
    public PageStructure() 
    { 
     Rows = new List<StructureElement>(); 
    } 
} 

internal class StructureElement 
{ 
    public List<BlockAssigment> Columns { get; set; } 
    public StructureElement() 
    { 
     Columns = new List<BlockAssigment>(); 
    } 
} 

internal class BlockAssigment 
{ 
    public string Width { get; set; } 
} 

त्रुटि

प्रकार के 'System.Security.Permissions.ReflectionPermission, mscorlib अनुमति के लिए अनुरोध, संस्करण = 2.0.0.0, संस्कृति = तटस्थ, PublicKeyToken = b77a5c561934e089 ' अनुत्तीर्ण होना।


* अक्रमांकन

कोड मैं दोनों उदाहरण के अक्रमांकन के लिए उपयोग सिर्फ मानक .net है:

var serializer = new JavaScriptSerializer(); 
var obj = serializer.Deserialize<PageStructure>("jsonstring"); 

तो ऐसा लगता है कि पहला उदाहरण .net के लिए प्रतिबिंब का उपयोग कर नहीं है क्योंकि यह काम करता है। तो सवाल यह है:

क्या दूसरे उदाहरण को प्रतिबिंबित करते हुए .NET के बिना दूसरे उदाहरण को deserialize करने का कोई तरीका है?

JSON स्ट्रिंग और सी # कक्षाओं दोनों को संशोधित करने में कोई समस्या नहीं है, मुझे किसी भी तरह संरचना (आधार कॉलम सहित पंक्तियों के साथ मूल वस्तु) को रखना है।

उत्तर

3

मुझे लगता है सबसे बड़ी समस्या यह वास्तव में यहाँ है:

public class PictureSetting // public, works 

बनाम

internal class PageStructure // non-public, permission denied 

सैंडबॉक्स तरह गैर सरकारी प्रकार/सदस्यों का प्रतिबिंब रोक रहा है यह मेरे लिए लग रहा है। यह अधिकांश सैंडबॉक्स के साथ संगत होगा, उदाहरण के लिए सिल्वरलाइट: आप प्रतिबिंब का उपयोग कर सकते हैं, लेकिन केवल उन चीजों के लिए जो सामान्य रूप से करने में सक्षम होंगे - यानी सार्वजनिक प्रकार/सदस्यों तक पहुंचें। PageStructure, StructureElement और BlockAssigmentpublic कक्षाओं में बनाने का प्रयास करें।

+0

हाँ, यह है! बहुत बढ़िया, बहुत बहुत धन्यवाद! मैंने इसे सार्वजनिक में बदल दिया और यह काम करता है। तो ऐसा लगता है कि सैंडबॉक्स सामान्य रूप से प्रतिबिंब को प्रतिबंधित नहीं कर रहा है लेकिन गैर-सार्वजनिक जैसा आपने कहा था। दिलचस्प। मैं हर दिन थोड़ा सा सीखता हूं :) – Marc

-1

आप इस सेवा का उपयोग http://json2csharp.com/ को पार्सिंग जेसन के लिए सही सी # क्लोज़ उत्पन्न करने के लिए कर सकते हैं।

+1

बहुत अच्छा लिंक, धन्यवाद! लेकिन इस सवाल के साथ कुछ भी नहीं है ... – Marc