在不使用反射的情况下反序列化C#中的JSON字符串
我正在Sharepoint中开发一个沙盒解决方案,其中的重要限制(关于此问题)是使用.net 3.5,不允许进行任何反思在不使用反射的情况下反序列化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
示例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类。是的,就是这样!太棒了,非常感谢!我把它改成了公共的,它可以工作。因此,沙箱似乎并不是一般地禁止反射,而是像你所说的那样禁止非公众的反射。有趣。我每天都学一点:)