JSON格式解析,遇到ArgumentException: JSON must represent an object type.报错问题

参考文章:Unity问题记录(三) ------ Unity.JsonUtility序列化出现ArgumentException: JSON must represent an object type._argumentexception: json parse error: invalid value-CSDN博客

解析JSON文件报错: ArgumentException: JSON must represent an object type.

问题原因:Unity中JsonUtility不直接支持JSON数组,仅支持JSON文件格式

数据组的格式如下

  [
    {
      "name": "Object1",
      "x": 10.5,
      "y": 20.3
    },
    {
      "name": "Object2",
      "x": 15.2,
      "y": 25.7
    },
    {
      "name": "Object3",
      "x": 8.7,
      "y": 18.9
    }
  ]

JSON文件的内容类似于:

{
  "objectDetails": [
    {
      "name": "Object1",
      "x": 10.5,
      "y": 20.3
    },
    {
      "name": "Object2",
      "x": 15.2,
      "y": 25.7
    },
    {
      "name": "Object3",
      "x": 8.7,
      "y": 18.9
    }
  ]
}

解决方法:

  • 使用JsonHelper类来解析JSON数组。因为Unity的JsonUtility不直接支持JSON数组,所以我们需要这个辅助类。

创建一个将JSON数组快速包装成JSON文件的方法JsonHelper

    /// <summary>
    /// JSON快速包装方法
    /// </summary>
    public static class JsonHelper
    {
        public static T[] FromJson<T>(string json)
        {
            string newJson = "{ \"array\": " + json + "}";
            Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(newJson);
            return wrapper.array;
        }

        [System.Serializable]
        private class Wrapper<T>
        {
            public T[] array;
        }
    }

使用 JsonHelper包装JSON文件并解析文件

    /// <summary>
    /// 解析接收到的数据
    /// </summary>
    /// <param name="jsonData"></param>
    void ProcessData(string jsonData)
    {
        //List<ObjectInfo> objects = new List<ObjectInfo>();


        // 解析JSON数据
        var objectDetails = JsonHelper.FromJson<ObjectDetail>(jsonData);
        foreach (var detail in objectDetails)
        {

            //Debug.Log($"Name: {detail.name}, X: {detail.x}, Y: {detail.y}");
            string Name = detail.name;
            float X = detail.x;
            float Y = detail.y;

            objects.Add(new ObjectInfo(Name, X, Y));
            //Debug.Log($"Name: {detail.name}, X: {detail.x}, Y: {detail.y}");
             射线投射并转换为世界坐标
            //CastRayAndAddToGlobalList(name, new Vector2(newX, newY));
            
        }
        //CreateObjectsFromData();

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值