RestSharp反序列化@开头的JSON键名时字段映射失败如何解决
问题根因
RestSharp v107及以上版本默认使用System.Text.Json作为内置JSON序列化/反序列化实现,而非Newtonsoft.Json(Json.NET)。[JsonProperty]特性属于Newtonsoft.Json的命名空间,默认序列化器无法识别该特性,因此无论特性内传入的键名是什么,都不会触发自定义映射逻辑,最终导致带@前缀的@id字段始终无法完成绑定。
三种尝试写法均不生效的具体原因:
- 直接定义
public string id { get; set; }:属性名与JSON实际键名@id不匹配,默认按名称匹配的规则无法命中 - 添加
[JsonProperty("id")]特性:一是特性本身不被默认序列化器识别,二是传入的键名缺少@前缀,与实际键名不符 - 添加
[JsonProperty("@id")]特性:特性属于Newtonsoft.Json,默认序列化器不识别该标注,映射规则不生效
可用解决方案
二选一即可:
方案1:使用默认序列化器的原生特性(无需额外依赖)
将属性上的特性替换为System.Text.Json原生的[JsonPropertyName]特性,引入对应命名空间即可,无需修改RestClient初始化逻辑。
实体类定义示例:
using System.Text.Json.Serialization; public class User { [JsonPropertyName("@id")] public string ID { get; set; } public string url { get; set; } public string username { get; set; } }
方案2:切换RestSharp序列化器为Newtonsoft.Json
如果项目中统一使用Newtonsoft.Json做序列化处理,可以给RestClient配置使用Newtonsoft.Json序列化器,配置完成后[JsonProperty("@id")]标注就可以正常生效。
操作步骤:
- 安装NuGet包
RestSharp.Serializers.NewtonsoftJson - 初始化RestClient时注入NewtonsoftJson序列化配置,代码示例:
RestClient restClient = new RestClient( "https://api.somewebsite.com/pub", configureSerialization: cfg => cfg.UseNewtonsoftJson() ); var request = new RestRequest($"user/Bob"); var actUser = await restClient.GetAsync<User>(request);
内容的提问来源于stack exchange,提问作者Crick3t
相关产品推荐
相关产品推荐

