使用Newtonsoft反序列化JSON时Data对应字段返回null问题
问题解决步骤
核心问题分析
你遇到的products字段反序列化后为null、无法生成AddInventoryProduct实例的问题,根源有三点:
- JSON中的数组字段名为
Data,但MyJson类中对应的属性是products,Newtonsoft.Json无法自动映射字段名不匹配的内容。 AddInventoryProduct类中使用了[JsonPropertyName]特性——这是System.Text.Json的专属特性,Newtonsoft.Json不识别,导致字段无法绑定。AddInventoryProduct类定义末尾存在语法错误(多余的])。
修正后的代码
类定义修正
using Newtonsoft.Json; // 必须引入Newtonsoft.Json命名空间 public class MyJson { public string Code { get; set; } public string Message { get; set; } // 用Newtonsoft的JsonProperty指定对应JSON中的Data字段 [JsonProperty("Data")] public List<AddInventoryProduct> Products { get; set; } } public class AddInventoryProduct { // 替换为Newtonsoft的JsonProperty特性 [JsonProperty("inventory_id")] public int InventoryId { get; set; } [JsonProperty("text_fields")] public Dictionary<string, object> TextFields { get; set; } }
Program.cs调整
注意访问属性时要和类中修正后的名称一致(遵循C#命名规范首字母大写):
async Task ProdAddWJson(string token) { using var httpClient = new HttpClient(); var baseLinkerClient = new BaseLinkerApiClient(httpClient, token) { ThrowExceptions = true }; try { using (StreamReader r = new StreamReader("C:\\file.json")) { string json = r.ReadToEnd(); Console.WriteLine(json); var inventory = JsonConvert.DeserializeObject<MyJson>(json); Console.WriteLine(inventory); // 对应类中的Products属性 var products = inventory.Products; foreach (var product in products) { Console.WriteLine($"InventoryId: {product.InventoryId}, Name: {product.TextFields["name"]}"); } } } catch (BaseLinkerException baseLinkerException) { Console.WriteLine($"Error! {baseLinkerException.ErrorCode} - {baseLinkerException.ErrorMessage}"); } }
效果验证
修正后,Newtonsoft.Json会正确将JSON中的Data数组映射到MyJson.Products属性,AddInventoryProduct的字段也能通过[JsonProperty]特性完成绑定,最终可以正常遍历和操作AddInventoryProduct实例。
内容的提问来源于stack exchange,提问作者Hajaro
相关产品推荐
相关产品推荐

