2012-08-14 27 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