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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 23:36:07