Unity JsonUtility解析JSON报根节点后存在其他值错误求助
Unity JsonUtility 解析报错
JSON parse error: The document root must not follow by other values 修复方案 报错核心原因
触发这个错误是因为代码和JSON结构存在多处不匹配,违反了Unity内置JsonUtility的解析规则,具体问题如下:
- 你的JSON文件根节点是一个带
data属性的包装对象,data对应的值才是轨道数据数组,代码直接将整个JSON反序列化为单个InitialOrbit实例,解析器读取完第一个根节点值后发现后续仍有未解析的数组内容,直接抛出该错误。 - 数据类字段定义和JSON结构完全不匹配:
id、links字段在JSON里和type、attributes、relationships平级,代码错误将其归入Relationships类中- JSON中
relationships下的对象字段名为object,代码定义为orbitObject,无法匹配 - 字段类型不匹配:
id在JSON中是字符串类型,代码定义为int;inc、sma、ecc等数值字段被定义为string,部分可空字段没有做兼容处理
JsonUtility不支持直接反序列化根节点为数组的JSON,必须通过普通对象包装承接数组数据- 代码中
List<InitialOrbit> orbits仅声明未初始化,直接调用Add方法会触发空引用异常 - 你贴出的JSON示例末尾用
...省略了内容,需确保实际文件中数组和根对象的括号完整闭合,否则也会触发解析错误。
修复步骤
1. 修正数据模型类
严格对齐JSON结构定义可序列化类,注意C#关键字object作为字段名时需要加@前缀,JsonUtility会自动识别匹配:
using UnityEngine; using System; using System.IO; using System.Collections.Generic; [Serializable] public class OrbitDataWrapper { // 对接JSON根节点的data数组 public List<InitialOrbit> data; } [Serializable] public class InitialOrbit { public string type; public Attributes attributes; public Relationships relationships; // 原代码错误放在Relationships类中的字段,提至平级 public string id; public Links links; } [Serializable] public class Attributes { public string epoch; public string mAno; // 数值字段改为对应浮点型,若需要区分null和0可改为string后自行转换 public float inc; public string frame; public string raan; public float sma; public float ecc; public float aPer; } [Serializable] public class Relationships { // JSON字段名为object,加@前缀匹配C#关键字规则 public OrbitObject @object; } [Serializable] public class OrbitObject { public Links links; } [Serializable] public class Links { public string self; public string related; }
2. 修正解析逻辑
初始化集合,使用包装类完成反序列化:
public class GetDepris : MonoBehaviour { public string jsonLibraryPath = "myPath"; List<InitialOrbit> orbits = new List<InitialOrbit>(); // 提前初始化集合 public void ReadOrbitFiles() { string path = Path.Combine(jsonLibraryPath, "Document.json"); Debug.Log(path); if (File.Exists(path)) { string json = File.ReadAllText(path); // 反序列化包装类 OrbitDataWrapper wrapper = JsonUtility.FromJson<OrbitDataWrapper>(json); if (wrapper != null && wrapper.data != null) { orbits.AddRange(wrapper.data); Debug.Log($"成功加载{orbits.Count}条轨道数据"); } } } void Start() { ReadOrbitFiles(); } }
补充说明
JsonUtility对字段名匹配大小写敏感,名称必须和JSON完全一致,否则字段会被赋值为默认值且不会抛出提示- 如果你需要更完善的null值、类型自动转换支持,可以直接使用Unity内置的Newtonsoft.Json包,替换
JsonUtility的解析逻辑即可,不需要修改数据结构 - 路径拼接建议使用
Path.Combine,避免不同平台下路径分隔符不兼容的问题
内容的提问来源于stack exchange,提问作者Alec
相关产品推荐
相关产品推荐

