2012-08-14 65 views
6

我正在研究Sharepoint中的沙盒解決方案,這是由於使用.net 3.5而導致的重要限制(與此問題有關),並且沒有允許反射。在C#中反序列化JSON字符串而不使用反射


例1

如果我嘗試反序列化的JSON字符串轉換爲一個簡單的類像這樣的正常工作:

JSON字符串

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

C#CLASS

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

例2

但如果我嘗試反序列化多一點複雜的字符串,我得到一個錯誤:

JSON字符串

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

C#類

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; } 
} 

ERROR

請求類型System.Security.Permissions.ReflectionPermission,mscorlib程序」的許可,版本= 2.0.0.0,文化=中性公鑰= b77a5c561934e089 '失敗。


* 反序列化

我用的這兩個例子反序列化的代碼只是標準的.NET:

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

如此看來,第一個例子.NET是而不是使用反射,因爲它的工作原理。所以問題是:

有沒有反序列化的第二個例子沒有.net使用內部反射?

修改JSON字符串和C#類都沒有問題,我只需要保持結構(含有列的基本對象包含列)。

回答

3

我懷疑最大的問題實際上是在這裏:

public class PictureSetting // public, works 

internal class PageStructure // non-public, permission denied 

它的聲音對我來說,沙箱是防止非公共類型/成員反射。這與大多數沙箱一致,例如Silverlight:您可以使用反射,但僅限於可以正常執行的操作 - 即訪問公共類型/成員。嘗試將PageStructure,StructureElementBlockAssigment分成public類。

+0

是的,就是這樣!太棒了,非常感謝你!我將它改爲公共,它可以工作。所以看起來,沙箱並不像你所說的那樣禁止一般的反射,而是非公開的。有趣。我每天學習一點:) – Marc 2012-08-14 06:57:19

-1

您可以使用此服務http://json2csharp.com/來生成正確的C#分類器來解析json。

+1

很不錯的鏈接,謝謝!但與這個問題根本沒有關係...... – Marc 2012-08-14 06:58:39