在不使用反射的情况下在C#中反序列化JSON字符串

Mar*_*arc 6 c# serialization json

我正在使用Sharepoint中的沙箱解决方案,由于使用了.net 3.5而且没有允许反射的重要限制(关于这个问题).


例1

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

JSON STRING

{"field":"Picture1","url":"whatever"}
Run Code Online (Sandbox Code Playgroud)

C#CLASS

public class PictureSetting
{
    public string field { get; set; }
    public string url { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

例2

但是,如果我尝试反序列化更复杂的字符串,我会收到一个错误:

JSON STRING

{
  "Rows": [
    {
      "Columns": [
        {
          "Width": "100"
        }
      ]
    }    
  ]
}
Run Code Online (Sandbox Code Playgroud)

C#CLASSES

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; }
}
Run Code Online (Sandbox Code Playgroud)

错误

请求类型'System.Security.Permissions.ReflectionPermission,mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的权限失败.


*DESERIALIZATION

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

var serializer = new JavaScriptSerializer();
var obj = serializer.Deserialize<PageStructure>("jsonstring");
Run Code Online (Sandbox Code Playgroud)

所以似乎对于第一个例子.net 没有使用反射,因为它起作用.所以问题是:

有没有办法反序列化第二个例子而不使用.net在内部使用反射?

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

Mar*_*ell 4

我怀疑最大的问题其实就在这里:

public class PictureSetting // public, works
Run Code Online (Sandbox Code Playgroud)

相对

internal class PageStructure // non-public, permission denied
Run Code Online (Sandbox Code Playgroud)

在我看来,沙箱正在阻止非公共类型/成员的反射。这与大多数沙箱一致,例如 Silverlight:您可以使用反射,但只能用于正常情况下可以执行的操作 - 即访问公共类型/成员。尝试将PageStructureStructureElementBlockAssigment放入public类中。