具有“ formattable”名称的C#JsonProperty

时间:2018-08-10 14:02:34

标签: c# azure json.net data-annotations json-deserialization

我有一个这样注释的模型:

[DataMember(EmitDefaultValue = false)]
[JsonProperty("extension_{0}_name")]
public string name {get; set;}

此数据正在通过查询检索到Azure域,并且通过邮递员,我可以看到实际的属性正在特定字段中填充:

{
     "extension_129af129412_name":"John",
     ...
}

其中129af129412AzurePropertyExtensionId属性匹配,该属性在我的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能够自行解决此问题。我想了解如何做到这一点。

1 个答案:

答案 0 :(得分:0)

事实证明,有一个ContractResolver实例负责JsonProperty字段名称的转换,但没有作为JsonSerializerSettings的一部分传递。将解析程序实例添加到(取消)序列化步骤后,便已成功检索到该字段。