我有一个这样注释的模型:
[DataMember(EmitDefaultValue = false)]
[JsonProperty("extension_{0}_name")]
public string name {get; set;}这些数据是通过查询Azure域来检索的,通过Postman,我可以看到在特定字段中填充的实际属性:
{
"extension_129af129412_name":"John",
...
}其中129af129412与AzurePropertyExtensionId属性匹配,该属性在我的Web.Config中定义为:
<appSettings>
<add key="AzurePropertyExtensionId" value="129af129412" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>但是,当我尝试用JsonConvert.DeserializeObject<>反序列化对象时,该字段没有被检索到。我怀疑这是因为绑定是在字段name_{0}_property而不是name_129af129412_property上进行的。
我猜是Web.Config的xdt:Transform属性出了问题:不管是谁写的,都以为JsonProperty名称会被正确重写,但事实并非如此。一旦使用JsonConvert序列化,该字段就被序列化为extension_{0}_name。这里出了什么问题?
旁注: Azure有一个有趣的行为,我们将带有{0}占位符的序列化模型发送到Azure,而且字段无论如何都会保存在Azure上。因此,似乎我们在WebServer上无法反序列化字段,因为字段名称之间不匹配,Azure本身就有能力克服这个问题。我有兴趣了解这是如何实现的。
发布于 2018-08-10 22:30:29
事实证明,有一个ContractResolver实例负责JsonProperty字段名的转换,该实例没有作为JsonSerializerSettings的一部分传递。将冲突解决程序实例添加到(反)序列化步骤后,即可成功检索该字段。
https://stackoverflow.com/questions/51788237
复制相似问题