使用C# Newtonsoft反序列化JSON遇解析错误求助
解决JSON反序列化错误的方案
错误原因
- 类型不匹配:
test2类中data字段被定义为string,但接口返回的JSON里data是一个嵌套的复杂对象,Newtonsoft尝试将对象解析为字符串时触发错误。 - 实体结构与JSON层级不匹配:
- JSON最外层仅包含
data属性,而test2将所有子属性(如code、name)平级放在最外层,完全不符合层级关系; - JSON中
products是数组类型,你定义为单个_products对象; - JSON中
paid是布尔值,你定义为string类型; _paginator中的next_page_url和prev_page_url是字符串/null,你定义为bool类型,会导致解析失败。
- JSON最外层仅包含
修正后的实体类
// 最外层根对象 public class Root { public Data data { get; set; } } // 对应JSON中的data对象 public class Data { // 用JsonExtensionData处理"0"、"1"这类动态键的用户数据 [JsonExtensionData] public Dictionary<string, JToken> UserItems { get; set; } public Paginator paginator { get; set; } public Message message { get; set; } } // 用户实体(对应JSON中"0"、"1"的值) public class User { public string code { get; set; } public string name { get; set; } public string currency { get; set; } public double best_price { get; set; } public bool paid { get; set; } public List<Product> products { get; set; } public string archive_time { get; set; } } // 产品实体 public class Product { public string name { get; set; } public string price { get; set; } public int id { get; set; } } // 分页实体 public class Paginator { public int total_count { get; set; } public int total_pages { get; set; } public int current_page { get; set; } public int per_page { get; set; } public string next_page_url { get; set; } public string prev_page_url { get; set; } } // 消息实体 public class Message { public string message { get; set; } public int status_code { get; set; } }
修正后的反序列化代码
// 注意:如果result已经是字符串,不需要调用ToString() var account = JsonConvert.DeserializeObject<Root>(result); // 若要获取用户列表,可以将JToken转换为User对象 var users = account.data.UserItems .Select(kv => kv.Value.ToObject<User>()) .ToList();
请求代码优化建议
避免使用.Result同步阻塞(可能导致死锁),改用异步await:
var response = await client.GetAsync(endpoint); // 确保请求成功,否则抛出异常 response.EnsureSuccessStatusCode(); var result = await response.Content.ReadAsStringAsync();
内容的提问来源于stack exchange,提问作者0kkult0
相关产品推荐
相关产品推荐

