C# Newtonsoft 使用声明反序列化自定义对象?

标签 c# .net asp.net-mvc asp.net-core .net-core

我有以下简单的 POCO:

  public class ApiKey
  {
    public ApiKey(string key, string owner, List<Claim> claims = null)
    {
      Key = key;
      OwnerName = owner;
      Claims = claims ?? new List<Claim>();
    }

    public string Key { get; }
    public string OwnerName { get; }
    public IReadOnlyCollection<Claim> Claims { get; set; }
  }
我可以使用一个声明创建此对象的实例,并使用 Newtonsoft 对其进行序列化:
JsonConvert.SerializeObject(key)
并获得这样的序列化 ApiKey:
"{\"Key\":\"94a5b81f-9837-4c5f-9821-3ebaedc6435d\",\"OwnerName\":null,\"Claims\":[{\"Issuer\":\"LOCAL AUTHORITY\",\"OriginalIssuer\":\"LOCAL AUTHORITY\",\"Properties\":{},\"Subject\":null,\"Type\":\"AdminClaim\",\"Value\":\"AdminClaim\",\"ValueType\":\"http://www.w3.org/2001/XMLSchema#string\"}]}"
但是,如果尝试使用 Newtonsoft 反序列化该字符串,如下所示:
JsonConvert.DeserializeObject<ApiKey>(serialized_key);
我收到以下错误:
Newtonsoft.Json.JsonSerializationException: Unable to find a constructor to use for type System.Security.Claims.Claim. A class should either have a default constructor, one constructor with arguments or a constructor marked with the JsonConstructor attribute. Path 'Claims[0].Issuer', line 1, position 83.
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateNewObject(JsonReader reader, JsonObjectContract objectContract, JsonProperty containerMember, JsonProperty containerProperty, String id, Boolean& createdFromNonDefaultCreator)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.PopulateList(IList list, JsonReader reader, JsonArrayContract contract, JsonProperty containerProperty, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateList(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, Object existingValue, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ResolvePropertyAndCreatorValues(JsonObjectContract contract, JsonProperty containerProperty, JsonReader reader, Type objectType)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObjectUsingCreatorWithParameters(JsonReader reader, JsonObjectContract contract, JsonProperty containerProperty, ObjectConstructor`1 creator, String id)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal(JsonReader reader, Type objectType, JsonContract contract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerMember, Object existingValue)
   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)
   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)
   at Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings)
   at Newtonsoft.Json.JsonConvert.DeserializeObject[T](String value, JsonSerializerSettings settings)
当我希望取回我首先序列化的原始对象时。我缺少什么能够反序列化这个对象?
谢谢!
编辑: Claim 对象来自 System.Security.Claims.Claim。
编辑 2:我希望能够序列化/反序列化整个 ApiKey 类,而不仅仅是声明部分。
编辑 3:我无法修改 ApiKey 类。

最佳答案

您将必须编写一个自定义转换器,此答案中有一个 Claim 类的示例:https://stackoverflow.com/a/28155770/6881299

关于C# Newtonsoft 使用声明反序列化自定义对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63634652/

相关文章:

c# - 调用 ajax asp web 表单 (C#) visual Studio 2010

javascript - 在 IE 浏览器中运行我的 MVC Web 应用程序时遇到数据表错误

javascript - 下载 Ajax 返回的 PDF

c# - 自定义文本框控件

c# - 如何对输入值进行排序

.net - 使用 Oslo 和 M 有什么优势,你会在什么时候使用它?

C# - 在 Windows 中检索目录下所有只读文件的列表

c# - 使用 asp.NET 保存 Excel 文件时出现问题

c# - IE VS Chrome 和 Firefox 中的网络安全(错误)

c# - 除法不返回我期望的十进制值