6

我正在研究 Sharepoint 中的沙盒解决方案,因此重要的限制(关于这个问题)是使用 .net 3.5 并且不允许反射。


例 1

如果我尝试将 JSON 字符串反序列化为像这样的简单类,它可以正常工作:

JSON字符串

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

C#类

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

错误

请求“System.Security.Permissions.ReflectionPermission、mscorlib、Version=2.0.0.0、Culture=neutral、PublicKeyToken=b77a5c561934e089”类型的权限失败。


*反序列化

我用于反序列化两个示例的代码只是标准的.net:

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

因此,对于第一个示例,.net 似乎没有使用反射,因为它有效。所以问题是:

有没有一种方法可以反序列化第二个示例而无需.net 在内部使用反射?

修改 JSON 字符串和 C# 类都没有问题,我只需要以某种方式保留结构(行包括列的基础对象)。

4

2 回答 2

3

我怀疑最大的问题实际上在这里:

public class PictureSetting // public, works

相对

internal class PageStructure // non-public, permission denied

在我看来,沙盒正在阻止非公共类型/成员的反射。这将与大多数沙箱一致,例如 Silverlight:您可以使用反射,但仅限于可以正常执行的操作 - 即访问公共类型/成员。尝试制作PageStructureStructureElementBlockAssigment进入public课堂。

于 2012-08-14T06:37:37.277 回答
-1

您可以使用此服务http://json2csharp.com/生成正确的 C# 类来解析 json。

于 2012-08-14T06:55:35.963 回答