使用Newtonsoft.Json反序列化嵌套JSON属性失败的解决方法求助
问题修正方案
核心问题是你混淆了JSON序列化库的特性标签:Newtonsoft.Json(Json.NET)不支持[JsonPropertyName],这个标签属于.NET内置的System.Text.Json库。Json.NET对应的属性映射标签是[JsonProperty],这就是嵌套对象属性无法赋值的根本原因。
修正步骤
替换特性标签
将所有类中用于属性映射的[JsonPropertyName("xxx")]替换为[JsonProperty("xxx")],并确保代码顶部引用了Newtonsoft.Json命名空间。正确的类定义示例
using Newtonsoft.Json; public class TestClass { [JsonProperty("type")] public string Type { get; set; } [JsonProperty("event_date")] public DateTime EventDate { get; set; } [JsonProperty("transaction")] public Transaction Transaction { get; set; } [JsonProperty("failureReport")] public FailureReport FailureReport { get; set; } } public class Transaction { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("authorization")] public string Authorization { get; set; } [JsonProperty("operation_type")] public string OperationType { get; set; } } public class FailureReport { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("failureType")] public string FailureType { get; set; } }反序列化验证
以两种JSON结构为例,反序列化后嵌套属性将正常赋值:- 成功类型JSON示例:
{ "type": "success", "event_date": "2024-05-20T10:30:00", "transaction": { "id": "txn_123", "authorization": "auth_456", "operation_type": "purchase" } } - 失败类型JSON示例:
{ "type": "failure", "event_date": "2024-05-20T10:35:00", "failureReport": { "id": "fail_789", "failureType": "insufficient_funds" } }
反序列化代码:
// 成功类型 var successJson = "..."; // 上述成功JSON字符串 var successResult = JsonConvert.DeserializeObject<TestClass>(successJson); // successResult.Transaction.Id 等属性将正确赋值 // 失败类型 var failureJson = "..."; // 上述失败JSON字符串 var failureResult = JsonConvert.DeserializeObject<TestClass>(failureJson); // failureResult.FailureReport.FailureType 等属性将正确赋值- 成功类型JSON示例:
额外注意事项
- 如果项目中同时引用了
System.Text.Json和Newtonsoft.Json,要确保特性标签和序列化方法对应,避免混用。 - 若需要保留
[JsonPropertyName],则需改用System.Text.Json的JsonSerializer.Deserialize方法,但你当前使用的是Newtonsoft.Json,所以优先替换标签更直接。
内容的提问来源于stack exchange,提问作者Felipe La Rotta
相关产品推荐
相关产品推荐

