c# - 如何修复 ArgumentException:JSON 必须表示对象类型
问题描述
我正在统一获取 web api,但出现错误。这是错误。
ArgumentException:JSON 必须表示对象类型。UnityEngine.JsonUtility.FromJson (System.String json, System.Type 类型) (在 C:/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:42) UnityEngine.JsonUtility.FromJson[T] ( System.String json) (在 C:/buildslave/unity/build/Modules/JSONSerialize/Public/JsonUtility.bindings.cs:30) RestClient+d__3.MoveNext () (在 Assets/_Scripts/RestClient.cs:34) UnityEngine .SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (在 C:/buildslave/unity/build/Runtime/Export/Scripting/Coroutines.cs:17)
这是我的 json 回复
[
{
"id":"1",
"name":"Yasir",
"mobile":"0301",
"password":"123"
},
{
"id":"2",
"name":"Mehmood",
"mobile":"0302",
"password":"123"
},
{
"id":"3",
"name":"Imran",
"mobile":"0301",
"password":"123"
},
{
"id":"4",
"name":"Iqbal",
"mobile":"0302",
"password":"123"
}
]
ReastClient.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
public class RestClient : MonoBehaviour
{
private static RestClient _instance;
public static RestClient Instance{
get{
if(_instance == null){
_instance = FindObjectOfType<RestClient>();
if(_instance == null){
GameObject go = new GameObject();
go.name =typeof(RestClient).Name;
_instance = go.AddComponent<RestClient>();
}
}
return _instance;
}
}
public IEnumerator Get(string url, System.Action<PlayerList> callBack)
{
using (UnityWebRequest www = UnityWebRequest.Get(url))
{
yield return www.SendWebRequest();
if (www.isNetworkError)
{
print(www.error);
}else if (www.isDone)
{
string jsonResult = System.Text.Encoding.UTF8.GetString(www.downloadHandler.data);
PlayerList playerlist = JsonUtility.FromJson<PlayerList>(jsonResult);
callBack(playerlist);
}
}
}
}
游戏.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Game : MonoBehaviour
{
public string web_url = "";
// Start is called before the first frame update
void Start()
{
StartCoroutine(RestClient.Instance.Get(web_url,GetPlayers));
}
void GetPlayers(PlayerList playerlist)
{
foreach(Player player in PlayerList.players)
{
print("Player Id = " + player.id);
}
}
}
播放器列表.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class PlayerList
{
public static List<Player> players;
}
播放器.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class Player
{
public int id;
public string name;
public string mobile;
public string password;
}
解决方案
我猜,那JsonUtility.FromJson<T>
是期待一个对象而不是“只是”一个数组。
所以 json 应该是这样的:
{
"players": [
{
"id":"1",
"name":"Yasir",
"mobile":"0301",
"password":"123"
},
...
]
}
然后PlayerList
's字段players
不能是静态的。
推荐阅读
- python - Python循环导入,不能在两个文件之间导入函数?
- javascript - 处理逗号语句的javascript美化器
- dataframe - 在 Julia 中使用“if...else”创建字典?
- javascript - 如何加载一次日志文件,然后在 JavaScript 中附加新日志?
- android - 如何实现可以同时处理数据包的服务器?
- pyspark - 使用循环创建 Spark SQL 查询
- qt - 使用 QAbstractProxyModel 将 QSqlTableModel 映射到 QTreeView 的问题
- visual-studio-code - 将“search.smartCase”从 true 更改为 false 或反之亦然时是否有明显效果
- excel - 如何使用 Excel VBA 将 pdf 转换为 xlsx
- ruby-on-rails - Rails has_many 通过 HABTM 关系