<tfoot id='x9aum'></tfoot>
    <legend id='x9aum'><style id='x9aum'><dir id='x9aum'><q id='x9aum'></q></dir></style></legend>
      <bdo id='x9aum'></bdo><ul id='x9aum'></ul>

    <small id='x9aum'></small><noframes id='x9aum'>

  • <i id='x9aum'><tr id='x9aum'><dt id='x9aum'><q id='x9aum'><span id='x9aum'><b id='x9aum'><form id='x9aum'><ins id='x9aum'></ins><ul id='x9aum'></ul><sub id='x9aum'></sub></form><legend id='x9aum'></legend><bdo id='x9aum'><pre id='x9aum'><center id='x9aum'></center></pre></bdo></b><th id='x9aum'></th></span></q></dt></tr></i><div id='x9aum'><tfoot id='x9aum'></tfoot><dl id='x9aum'><fieldset id='x9aum'></fieldset></dl></div>

      1. 如何在反序列化期间以编程方式选择构造函数?

        时间:2023-08-24
      2. <legend id='I9BzD'><style id='I9BzD'><dir id='I9BzD'><q id='I9BzD'></q></dir></style></legend>

          <small id='I9BzD'></small><noframes id='I9BzD'>

          <i id='I9BzD'><tr id='I9BzD'><dt id='I9BzD'><q id='I9BzD'><span id='I9BzD'><b id='I9BzD'><form id='I9BzD'><ins id='I9BzD'></ins><ul id='I9BzD'></ul><sub id='I9BzD'></sub></form><legend id='I9BzD'></legend><bdo id='I9BzD'><pre id='I9BzD'><center id='I9BzD'></center></pre></bdo></b><th id='I9BzD'></th></span></q></dt></tr></i><div id='I9BzD'><tfoot id='I9BzD'></tfoot><dl id='I9BzD'><fieldset id='I9BzD'></fieldset></dl></div>

            • <bdo id='I9BzD'></bdo><ul id='I9BzD'></ul>

                1. <tfoot id='I9BzD'></tfoot>

                    <tbody id='I9BzD'></tbody>
                2. 本文介绍了如何在反序列化期间以编程方式选择构造函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我想反序列化一个 System.Security.Claims.Claim 对象,通过以下方式序列化:

                  I would like to deserialize a System.Security.Claims.Claim object serialized in the following way:

                  {
                      "Issuer" : "LOCAL AUTHORITY",
                      "OriginalIssuer" : "LOCAL AUTHORITY",
                      "Type" : "http://my.org/ws/2015/01/identity/claims/mytype",
                      "Value" : "myvalue",
                      "ValueType" : "http://www.w3.org/2001/XMLSchema#string"
                  }
                  

                  我得到的是一个 JsonSerializationException:

                  找不到用于类型的构造函数System.Security.Claims.Claim.一个类应该有一个默认值构造函数,一个带参数的构造函数或一个标记的构造函数带有 JsonConstructor 属性.

                  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.

                  经过一番调查,我终于明白了上述消息中 one 的含义:JSON 反序列化程序无法找到正确的构造函数 - 在 Claim 的情况下type - 多个带参数的构造函数(尽管存在一个参数与上述属性完全匹配的构造函数).

                  After some investigation I finally understand the meaning of one in the above message: The JSON deserializer cannot find the right constructor as there are - in the case of the Claim type - multiple constructors with arguments (although there exists a constructor with arguments matching exactly the above properties).

                  有没有办法告诉反序列化器选择哪个构造函数而不向该 mscorlib 类型添加 JsonConstructor 属性?

                  Is there a way to tell the deserializer which constructor to choose without adding the JsonConstructor attribute to that mscorlib type?

                  Daniel Halan 用 Json 补丁解决了这个问题.NET 几年前.这些天有没有办法在不修改 Json.NET 的情况下解决这个问题?

                  Daniel Halan has solved this issue with a patch to Json.NET a few years ago. Is there a way to solve this without modifying Json.NET these days?

                  推荐答案

                  如果无法为目标类添加 [JsonConstructor] 属性(因为你不拥有代码),那么通常的解决方法是创建一个自定义 JsonConverter 正如@James Thorpe 在评论中所建议的那样.这很简单.您可以将 JSON 加载到 JObject 中,然后从中挑选各个属性来实例化您的 Claim 实例.这是您需要的代码:

                  If it is not possible to add a [JsonConstructor] attribute to the target class (because you don't own the code), then the usual workaround is to create a custom JsonConverter as was suggested by @James Thorpe in the comments. It is pretty straightforward. You can load the JSON into a JObject, then pick the individual properties out of it to instantiate your Claim instance. Here is the code you would need:

                  class ClaimConverter : JsonConverter
                  {
                      public override bool CanConvert(Type objectType)
                      {
                          return (objectType == typeof(System.Security.Claims.Claim));
                      }
                  
                      public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
                      {
                          JObject jo = JObject.Load(reader);
                          string type = (string)jo["Type"];
                          string value = (string)jo["Value"];
                          string valueType = (string)jo["ValueType"];
                          string issuer = (string)jo["Issuer"];
                          string originalIssuer = (string)jo["OriginalIssuer"];
                          return new Claim(type, value, valueType, issuer, originalIssuer);
                      }
                  
                      public override bool CanWrite
                      {
                          get { return false; }
                      }
                  
                      public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
                      {
                          throw new NotImplementedException();
                      }
                  }
                  

                  要使用转换器,只需将它的一个实例传递给 JsonConvert.DeserializeObject() 方法调用:

                  To use the converter, simply pass an instance of it to the JsonConvert.DeserializeObject<T>() method call:

                  Claim claim = JsonConvert.DeserializeObject<Claim>(json, new ClaimConverter());
                  

                  小提琴:https://dotnetfiddle.net/7LjgGR

                  这篇关于如何在反序列化期间以编程方式选择构造函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:Json.Net - 序列化不带引号的属性名称 下一篇:将嵌套的 JSON 反序列化为 C# 对象

                  相关文章

                  最新文章

                      <bdo id='UAfMC'></bdo><ul id='UAfMC'></ul>

                    1. <tfoot id='UAfMC'></tfoot>

                      <legend id='UAfMC'><style id='UAfMC'><dir id='UAfMC'><q id='UAfMC'></q></dir></style></legend>
                    2. <small id='UAfMC'></small><noframes id='UAfMC'>

                      <i id='UAfMC'><tr id='UAfMC'><dt id='UAfMC'><q id='UAfMC'><span id='UAfMC'><b id='UAfMC'><form id='UAfMC'><ins id='UAfMC'></ins><ul id='UAfMC'></ul><sub id='UAfMC'></sub></form><legend id='UAfMC'></legend><bdo id='UAfMC'><pre id='UAfMC'><center id='UAfMC'></center></pre></bdo></b><th id='UAfMC'></th></span></q></dt></tr></i><div id='UAfMC'><tfoot id='UAfMC'></tfoot><dl id='UAfMC'><fieldset id='UAfMC'></fieldset></dl></div>