gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:11:07 25 4
gpt4 key购买 nike

我想反序列化按以下方式序列化的 System.Security.Claims.Claim 对象:

{
"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:

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 的含义:在 Claim 的情况下,JSON 反序列化器无法找到正确的构造函数类型 - 带参数的多个构造函数(尽管存在一个带参数的构造函数与上述属性完全匹配)。

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

Daniel Halan 用 patch to Json.NET a few years ago 解决了这个问题.这些天有没有办法在不修改 Json.NET 的情况下解决这个问题?

最佳答案

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

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<T>()方法调用:

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

fiddle :https://dotnetfiddle.net/7LjgGR

关于c# - 如何在反序列化期间以编程方式选择构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28155169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com