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

在不使用反射的情况下反序列化C#中的JSON字符串,c#,json,serialization,C#,Json,Serialization,我正在Sharepoint中开发一个沙盒解决方案,其中的重要限制(关于此问题)是使用.net 3.5,不允许进行任何反思 示例1 如果我尝试将JSON字符串反序列化为一个简单的类,如下所示: JSON字符串 {"field":"Picture1","url":"whatever"} C#CLASS public class PictureSetting { public string field { get; set; } public string url { get; s

我正在Sharepoint中开发一个沙盒解决方案,其中的重要限制(关于此问题)是使用.net 3.5,不允许进行任何反思


示例1

如果我尝试将JSON字符串反序列化为一个简单的类,如下所示:

JSON字符串

{"field":"Picture1","url":"whatever"}
C#CLASS

public class PictureSetting
{
    public string field { get; set; }
    public string url { get; set; }
}
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; }
}

示例2

但如果我尝试反序列化稍微复杂一点的字符串,我会得到一个错误:

JSON字符串

{
  "Rows": [
    {
      "Columns": [
        {
          "Width": "100"
        }
      ]
    }    
  ]
}
C#类

public class PictureSetting
{
    public string field { get; set; }
    public string url { get; set; }
}
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; }
}
内部类页面结构
{
公共列表行{get;set;}
公共页面结构()
{
行=新列表();
}
}
内部类结构元素
{
公共列表列{get;set;}
公共结构元素()
{
Columns=新列表();
}
}
内部类块分配
{
公共字符串宽度{get;set;}
}
错误

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


*反序列化

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

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

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

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


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

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

public class PictureSetting // public, works

internal class PageStructure // non-public, permission denied

在我看来,沙箱似乎阻止了非公共类型/成员的反射。这与大多数沙盒(例如Silverlight)是一致的:您可以使用反射,但只能用于可以正常执行的操作,即访问公共类型/成员。尝试将
PageStructure
structurelement
BlockAssigment
放入
public
类中。

您可以使用此服务生成正确的解析json的C类。

是的,就是这样!太棒了,非常感谢!我把它改成了公共的,它可以工作。因此,沙箱似乎并不是一般地禁止反射,而是像你所说的那样禁止非公众的反射。有趣。我每天都学一点:)