Unity使用JsonUtility.FromJson无法提取REST API返回JSON的coord字段值
问题原因
- 核心错误是类上的特性用错了:
[SerializeField]是用于修饰类的字段/属性的特性,你需要给自定义的可序列化类添加[System.Serializable]特性才能让Unity的JsonUtility正确识别并解析嵌套类结构。 - 额外问题:你当前的代码在请求报错的情况下依然会执行JSON解析逻辑,可能会引发空引用异常,建议把解析逻辑移到请求成功的分支内。
修复后的完整代码
using UnityEngine; using UnityEngine.Networking; using System.Collections; public class GetMethod : MonoBehaviour { public WeatherInfo Info; void GetData() => StartCoroutine(GetData_Coroutine()); IEnumerator GetData_Coroutine() { string uri = "http://localhost:3000/api/weather/current?lat=22.426522&lon=114.234446&unit=metric"; using (UnityWebRequest request = UnityWebRequest.Get(uri)) { yield return request.SendWebRequest(); if (request.isNetworkError || request.isHttpError) { Debug.Log(request.error); } else { Debug.Log(request.downloadHandler.text); Info = JsonUtility.FromJson<WeatherInfo>(request.downloadHandler.text); Debug.Log(Info.coord.lon.ToString()); } } } } // 替换原有的[SerializeField]为序列化类特性 [System.Serializable] public class WeatherInfo { public Coord coord; public string name; } // 替换原有的[SerializeField]为序列化类特性 [System.Serializable] public class Coord { public float lon; public float lat; }
额外注意事项
- 如果你后续需要解析JSON里的
weather数组、main结构体,也要对应定义加了[System.Serializable]的类,数组类型用public WeatherItem[] weather即可。 - 若JSON字段名和C#类字段名大小写不一致,Unity自带的JsonUtility不支持字段映射,要么统一字段大小写,要么换用Unity 2020+内置的Newtonsoft.Json进行解析。
内容的提问来源于stack exchange,提问作者mak Felix
相关产品推荐
相关产品推荐

