如何在反序列化过程中以编程方式选择构造函数?我想反序列化按以下方式序列化的System.Security.Claims.Claim对象:{"Issuer":"LOCALAUTHORITY","OriginalIssuer":"LOCALAUTHORITY","Type":"http://my.org/ws/2015/01/identity/claims/mytype","Value":"myvalue","ValueType":"http://www.w3.org/2001/XMLSchema#string"}我得到一个JsonSerializationException:Unable查找类型System.Security.Claims.Claim的构造函数。一个类应该有一个默认构造函数,一个带参数的构造函数或一个标有JsonConstructor属性的构造函数。经过一番调查,我终于理解了上述消息之一的含义:JSON反序列化器找不到正确的构造函数-在Claim类型的情况下-多个带参数的构造函数(尽管存在一个,其参数与上述属性完全匹配).有没有办法告诉反序列化器选择哪个构造函数而不将JsonConstructor属性添加到该mscorlib类型?几年前,DanielHalan用Json.NET的补丁解决了这个问题。有没有办法在不修改Json.NET的情况下解决这个问题?如果无法将[JsonConstructor]属性添加到目标类(因为您不拥有代码),那么通常的解决方法是按照@JamesThorpe在评论中的建议创建自定义JsonConverter。这很简单。您可以将JSON加载到JObject中,然后JObject选择各个属性来实例化您的Claim实例。这是您需要的代码:}publicoverrideobjectReadJson(JsonReaderreader,TypeobjectType,objectexistingValue,JsonSerializerserializer){JObjectjo=JObject.Load(reader);字符串类型=(字符串)jo["类型"];字符串值=(字符串)jo["值"];字符串valueType=(string)jo["ValueType"];stringissuer=(string)jo["Issuer"];stringoriginalIssuer=(string)jo["OriginalIssuer"];返回新声明(类型,值,valueType,发行人,原始发行人);}publicoverrideboolCanWrite{get{returnfalse;}}publicoverridevoidWriteJson(JsonWriterwriter,objectvalue,JsonSerializerserializer){thrownewNotImplementedException();要使用转换器,只需将其实例传递给JsonConvert.DeserializeObject()方法调用:Claimclaim=JsonConvert.DeserializeObject(json,newClaimConverter());小提琴:https://dotnetfiddle.net/7LjgGR另一种方法,至少适用于子类化的非密封类,但仅适用于您感兴趣的构造函数:valueType,issuer,originalIssuer){}}然后,您可以在没有辅助类的情况下反序列化到该对象,并将其视为原始类型Claimclaim=JsonConvert.DeserializeObject(json);对于密封类你可以使用这种方法(假装声称一秒钟):以上是C#学习教程:Howtoprogrammaticallyselecttheconstructorduringdeserialization?如果分享的内容对你有用,需要了解更多C#学习教程,希望大家多多关注——classMyClaim{privateClaim_claim;publicMyClaim(stringtype,stringvalue,stringvalueType,stringissuer,stringoriginalIssuer){_claim=newClaim(type,value,valueType,issuer,originalIssuer);}publicClaimValue{get{return_claim;}}}声明claim=JsonConvert.DeserializeObject(json).Value;如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
