使用Newtonsoft JSON反序列化时,能否同时识别JsonProperty与C#属性名?
解决方案:给属性添加多个
JsonProperty特性 当然可以做到!Newtonsoft.Json(Json.NET)支持给同一个属性标注多个JsonProperty特性,每个特性指定一个可接受的JSON键名,这样反序列化时不管JSON里是ExternalId还是CustomerName,都会正确映射到你的ExternalId属性上。
修改后的MyClass代码
public class MyClass { [JsonProperty("CustomerName")] [JsonProperty("ExternalId")] public string ExternalId { get; set; } }
验证代码示例
你可以用下面的代码测试两种JSON的反序列化效果:
// 反序列化第一个JSON var json1 = "{ \"ExternalId\":\"Test1\" }"; var obj1 = JsonConvert.DeserializeObject<MyClass>(json1); Console.WriteLine(obj1.ExternalId); // 输出 Test1 // 反序列化第二个JSON var json2 = "{ \"CustomerName\":\"Test2\" }"; var obj2 = JsonConvert.DeserializeObject<MyClass>(json2); Console.WriteLine(obj2.ExternalId); // 输出 Test2
原理说明
当你给属性添加多个JsonProperty特性时,Json.NET会把所有指定的名称都视为该属性的有效JSON键名。反序列化时,只要JSON中存在其中任意一个名称的键,就会将对应的值赋值给这个属性。
如果因为某些原因你无法修改类的源代码(比如类是第三方库提供的),还可以通过自定义IContractResolver来实现相同的效果,但上面的特性方式是最直接、最简洁的方案。
内容的提问来源于stack exchange,提问作者Jason H
相关产品推荐
相关产品推荐

