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

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并没有使用反射,因为它可以正常工作。所以问题是:

有没有一种方法可以在不使用内部反射的情况下反序列化第二个例子?

修改JSON字符串和C#类都没有问题,只需保持结构(包含列的行的基本对象)即可。

2个回答

4
我怀疑最大的问题实际上在这里:
public class PictureSetting // public, works

对比

internal class PageStructure // non-public, permission denied

听起来像是沙盒机制防止了非公共类型/成员的反射。这与大多数沙盒机制一致,例如Silverlight:您可以使用反射,但仅限于正常情况下代码能够访问的公共类型/成员。请将PageStructureStructureElementBlockAssigment更改为public类。


是的,就是这样!太棒了,非常感谢!我将其更改为公共的,现在它可以工作了。所以看起来沙盒并没有普遍禁止反射,而是像你说的那样,禁止非公共的。有趣。我每天都在学习 :) - Marc

-2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接