如何将JSON的Line1/Line2映射到模型Addr_1/Addr_2并输出指定属性名
解决方案
你的问题出在JsonProperty特性默认会同时控制**序列化(输出JSON)和反序列化(解析输入JSON)**的字段名。当前代码里指定了"Line1",所以输出时也会用这个名称,而非属性名Addr_1。要实现“输入用Line1/Line2映射,输出用Addr_1/Addr_2”,分两种常用JSON库的情况处理:
情况1:使用Newtonsoft.Json(Json.NET)
如果你的项目用的是Newtonsoft.Json(版本12.0.1及以上),可以用JsonAlias特性替代JsonProperty来指定反序列化的别名,序列化时自动使用属性本身的名称:
public class Addresses { [JsonAlias("Line1")] public string Addr_1 { get; set; } [JsonAlias("Line2")] public string Addr_2 { get; set; } }
如果你的Newtonsoft.Json版本低于12.0.1,没有JsonAlias特性,可以自定义ContractResolver来分开控制:
public class CustomAddressContractResolver : DefaultContractResolver { protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); // 反序列化时映射别名 if (property.PropertyName == "Addr_1") { property.PropertyName = "Line1"; // 序列化时改回原属性名 property.SerializationName = "Addr_1"; } else if (property.PropertyName == "Addr_2") { property.PropertyName = "Line2"; property.SerializationName = "Addr_2"; } return property; } }
使用时,序列化和反序列化分别指定Resolver:
// 反序列化(用Line1/Line2映射) var addresses = JsonConvert.DeserializeObject<Addresses>(inputJson, new JsonSerializerSettings { ContractResolver = new CustomAddressContractResolver() }); // 序列化(输出Addr_1/Addr_2) var outputJson = JsonConvert.SerializeObject(addresses, new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });
情况2:使用System.Text.Json(.NET Core 3.0+ 内置)
对于.NET Core 3.0及以上版本的内置System.Text.Json,用JsonPropertyName指定序列化输出的名称,JsonAlias指定反序列化的别名:
using System.Text.Json.Serialization; public class Addresses { [JsonPropertyName("Addr_1")] [JsonAlias("Line1")] public string Addr_1 { get; set; } [JsonPropertyName("Addr_2")] [JsonAlias("Line2")] public string Addr_2 { get; set; } }
这样配置后,解析输入JSON时会识别Line1/Line2并映射到Addr_1/Addr_2,序列化输出时则会使用Addr_1/Addr_2作为字段名。
内容的提问来源于stack exchange,提问作者sameera guntimadugu
相关产品推荐
相关产品推荐

