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

为何无法读取JSON文件?Newtonsoft.Json解析报错排查

问题解决:JsonReaderException 及 Valera 类初始化错误

错误原因及修复步骤:

  1. 直接传入文件路径导致解析失败
    JsonConvert.DeserializeObject<T>的作用是解析JSON字符串内容,不是读取文件路径。你直接传入文件路径字符串,它会把路径当成JSON解析,自然会触发JsonReaderException(路径首字符是C,不属于JSON合法起始字符)。

修复代码:先读取文件内容再反序列化

public void init()
{
    // 先读取JSON文件的文本内容
    string jsonContent = File.ReadAllText(@"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\characteristics.json");
    var v = JsonConvert.DeserializeObject<Valera>(jsonContent);
    Console.WriteLine(v?.dead);
}

注意:需要引用System.IO命名空间才能使用File.ReadAllText。

  1. 私有字段无法被Json.NET访问
    你的Valera类字段都是private修饰,Json.NET默认只会处理公共属性,私有字段无法被赋值,就算解析成功,字段值也不会被正确初始化。

修复方案二选一:

  • 方案一(推荐,符合C#编码规范):把私有字段改成公共属性
public class Valera
{
    public int Health { get; set; } 
    public int Mana { get; set; } 
    public int Happiness { get; set; } 
    public int Fatigue { get; set; } 
    public bool Dead { get; set; } 

    public void Init()
    {
        string jsonContent = File.ReadAllText(@"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\characteristics.json");
        var v = JsonConvert.DeserializeObject<Valera>(jsonContent);
        Console.WriteLine(v?.Dead);
    }
}
  • 方案二(保留私有字段):给私有字段添加[JsonProperty]特性,允许Json.NET访问
public class Valera
{
    [JsonProperty]
    private int health; 
    [JsonProperty]
    private int mana; 
    [JsonProperty]
    private int happiness; 
    [JsonProperty]
    private int fatigue; 
    [JsonProperty]
    private bool dead; 

    public void init()
    {
        string jsonContent = File.ReadAllText(@"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\characteristics.json");
        var v = JsonConvert.DeserializeObject<Valera>(jsonContent);
        Console.WriteLine(v?.dead);
    }
}
  1. JSON值类型与类字段类型不匹配
    你的JSON中所有值都是字符串格式(比如"health" : "100"、"dead": "false"),但类里对应的是int和bool类型,直接反序列化会类型转换失败。

修复方案二选一:

  • 方案一:修改JSON文件,去掉字符串引号,改成对应类型的原生值
{
  "health" : 100,
  "mana": 50,
  "happiness": 0,
  "fatigue": 50,
  "dead": false
}
  • 方案二:如果不能修改JSON,在类里用字符串字段接收,再手动转换为目标类型
public class Valera
{
    public string Health { get; set; } 
    public string Mana { get; set; } 
    public string Happiness { get; set; } 
    public string Fatigue { get; set; } 
    public string Dead { get; set; } 

    // 新增转换后的属性供业务使用
    public int HealthValue => int.Parse(Health);
    public bool IsDead => bool.Parse(Dead);

    public void Init()
    {
        string jsonContent = File.ReadAllText(@"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\characteristics.json");
        var v = JsonConvert.DeserializeObject<Valera>(jsonContent);
        Console.WriteLine(v?.IsDead);
    }
}

最终可运行的完整示例

结合以上修复,最终代码和JSON如下:

Valera类:

using System.IO;
using Newtonsoft.Json;

public class Valera
{
    public int Health { get; set; } 
    public int Mana { get; set; } 
    public int Happiness { get; set; } 
    public int Fatigue { get; set; } 
    public bool Dead { get; set; } 

    public void Init()
    {
        string jsonPath = @"C:\Users\User\RiderProjects\MarginalValera\MarginalValera\Properties\characteristics.json";
        string jsonContent = File.ReadAllText(jsonPath);
        Valera v = JsonConvert.DeserializeObject<Valera>(jsonContent);
        Console.WriteLine(v.Dead); // 输出:false
    }
}

修改后的JSON文件:

{
  "health" : 100,
  "mana": 50,
  "happiness": 0,
  "fatigue": 50,
  "dead": false
}

内容的提问来源于stack exchange,提问作者Alica Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 06:11:16