【问题标题】:Deserializing a specific JSON [duplicate]反序列化特定的 JSON [重复]
【发布时间】:2016-10-19 14:18:26
【问题描述】:

我有一个序列化的 JSON 字符串 serializedClaims -

// The Claim here is System.Security.Claims.Claim    
var claims = new List<Claim>();

claims.Add(new Claim("MakerId", "939393", ClaimValueTypes.String));
claims.Add(new Claim(ClaimTypes.DateOfBirth, "1956-03-08", ClaimValueTypes.Date));

var serializedClaims = JsonConvert.SerializeObject(claims); 

现在我想将 serializedClaims 反序列化回列表。

但是当我这样做时

var list = JsonConvert.DeserializeObject<List<Claim>>(serializedClaims);

我收到“无法找到构造函数....”的错误

如何正确反序列化?

编辑: 一开始就是List&lt;Claim&gt;()。我得到的错误是尽管如此。如何为此分配一个空的构造函数??

【问题讨论】:

  • new List()是你写的方法吗?
  • 查看我的更新答案
  • 发布你的代码,复制粘贴,而不是实际上不是导致错误的代码。

标签: c# .net json list serialization


【解决方案1】:

在下面的代码块中,您尝试使用var claims = new List() 创建一个名为“claims”的变量。

但是你还没有告诉它它是什么列表。 您必须明确定义它是否是stringintapplespearsClaim 的列表

改为: var claims = new List&lt;Claim&gt;();

所以你的最终代码块应该如下所示:

claims.Add(new Claim("MakerId", "939393", ClaimValueTypes.String));
claims.Add(new Claim(ClaimTypes.DateOfBirth, "1956-03-08", ClaimValueTypes.Date));

var serializedClaims = JsonConvert.SerializeObject(claims); 

【讨论】:

    【解决方案2】:

    反序列化是使用反射的基本用法。

    首先你应该通过改变来使用泛型的力量:

    var claims = new List();
    

    与:

    var claims = new List<Claim>();
    

    然后,为了使其正常工作,您应该对 Claim 类进行一些调整。

    1. 指定默认(空)构造函数
    2. 使用 set 将所有相关属性 public;并得到;

    【讨论】:

    • 请参阅编辑。我应该用空的构造函数创建一个新类吗?
    • 我已经根据你的问题编辑了我的答案。
    • 这里的声明是 System.Security.Claims.Claim 所以我不知道如何为此指定空的构造函数。
    • 那么抱歉,您将需要另一种解决方案,如果是使用 Mike_G 答案,或者使用 AutoMapper 创建列表以从固定方案中填充它。
    【解决方案3】:
    var claims = new List();
    

    与通用的List&lt;Claim&gt;不一样

    尝试将您的 var claims 更改为 var claims = new List&lt;Claim&gt;()

    更新:

    尝试使用JsonCreationConverterhttp://www.newtonsoft.com/json/help/html/CustomCreationConverter.htm

        class ClaimsConverter : JsonCreationConverter<Claim>
        {
            protected override Claim Create(Type objectType, Newtonsoft.Json.Linq.JObject jObject)
            {
                    var type = jObject.Value<string>("Type");
                     var value = jObject.Value<string>("Value");
                  ....
                    return new Claim(type, value);
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多