反序列化特定的JSON

时间:2016-10-19 14:18:26

标签: c# .net json list serialization

我有序列化的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反序列化回List。

但是当我这样做时

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

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

如何正确反序列化?

编辑:一直以List<Claim>()开头。我得到的错误尽管如此。如何为此分配空构造函数?

3 个答案:

答案 0 :(得分:1)

var claims = new List();

与通用List<Claim>

不同

尝试将var claims更改为var claims = new List<Claim>()

<强>更新

尝试使用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);
        }

    }

答案 1 :(得分:1)

反序列化使用反射及其基本用法。

首先,你应该通过改变:

来使用泛型的力量
var claims = new List();

。通过

var claims = new List<Claim>();

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

  1. 指定默认(空)构造函数
  2. 使用设置所有相关属性公开;并得到;

答案 2 :(得分:1)

在下面的代码块中,您尝试创建一个名为&#39; claim&#39;使用var claims = new List()

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

的列表

相反: 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);