为何无法读取JSON文件?Newtonsoft.Json解析报错排查
问题解决:JsonReaderException 及 Valera 类初始化错误
错误原因及修复步骤:
- 直接传入文件路径导致解析失败
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。
- 私有字段无法被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); } }
- 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
相关产品推荐
相关产品推荐

