【问题标题】:Deserialize JSON string in C# without using reflection在C#中反序列化JSON字符串而不使用反射
【发布时间】:2012-08-14 06:22:08
【问题描述】:

我正在研究 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# 类都没有问题,我只需要以某种方式保留结构(行包括列的基础对象)。

【问题讨论】:

    标签: c# json serialization


    【解决方案1】:

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

    public class PictureSetting // public, works
    

    internal class PageStructure // non-public, permission denied
    

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

    【讨论】:

    • 是的,就是这样!太棒了,非常感谢!我将其更改为 public 并且它有效。因此,沙箱似乎不是一般禁止反射,而是如您所说的非公开。有趣的。我每天都学一点:)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      相关资源
      最近更新 更多