You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C# Newtonsoft反序列化JSON遇解析错误求助

解决JSON反序列化错误的方案

错误原因

  1. 类型不匹配:test2类中data字段被定义为string,但接口返回的JSON里data是一个嵌套的复杂对象,Newtonsoft尝试将对象解析为字符串时触发错误。
  2. 实体结构与JSON层级不匹配:
    • JSON最外层仅包含data属性,而test2将所有子属性(如code、name)平级放在最外层,完全不符合层级关系;
    • JSON中products是数组类型,你定义为单个_products对象;
    • JSON中paid是布尔值,你定义为string类型;
    • _paginator中的next_page_url和prev_page_url是字符串/null,你定义为bool类型,会导致解析失败。

修正后的实体类

// 最外层根对象
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 05:17:43