Unity中解决JsonUtility转换数组失败的BUG

由于转对象没问题,转数组才会产生问题。所以解决思路是:
转换时遇到数组,在数组外加壳,作为对象转成JSON,再去壳。
解析时遇到数组,先套壳转成对象,再取对象里的数组。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class JsonUtil
{

    /// <summary> 把对象转换为Json字符串 </summary>
    /// <param name="obj">对象</param>
    public static string toJson<T>(T obj)
    {
        if (obj == null) return "null";

        if (typeof(T).GetInterface("IList") != null)
        {
            Pack<T> pack = new Pack<T>();
            pack.data = obj;
            string json = JsonUtility.ToJson(pack);
            return json.Substring(8, json.Length - 9);
        }

        return JsonUtility.ToJson(obj);
    }

    /// <summary> 解析Json </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="json">Json字符串</param>
    public static T fromJson<T>(string json)
    {
        if (json == "null" && typeof(T).IsClass) return default(T);

        if (typeof(T).GetInterface("IList") != null)
        {
            json = "{\"data\":{data}}".Replace("{data}", json);
            Pack<T> Pack = JsonUtility.FromJson<Pack<T>>(json);
            return Pack.data;
        }

        return JsonUtility.FromJson<T>(json);
    }

    /// <summary> 内部包装类 </summary>
    private class Pack<T>
    {
        public T data;
    }

}
### UnityJsonUtility数组格式的支持 在 Unity 开发环境中,`JsonUtility` 是内置的一个用于处理 JSON 数据的工具类。对于数组格式的数据,`JsonUtility` 支持解析由对象组成的数组结构。 考虑如下 JSON 字符串: ```json { "Player": [ { "id": 1001, "name": "王二", "job": 1 }, { "id": 1002, "name": "小红", "job": 2 } ] } ``` 为了能够利用 `JsonUtility.FromJson<T>` 或者 `JsonUtility.FromJsonOverwrite` 来解析上述 JSON 数组,需要先定义相应的 C# 类来匹配 JSON 结构[^2]。 #### 定义对应的 C# 类型 针对上面的例子,可以创建两个类:一个是代表单个玩家信息的 `PlayerInfo` 类;另一个是用来封装这些玩家列表的容器类 `PlayersContainer`: ```csharp using System.Collections.Generic; [System.Serializable] public class PlayerInfo { public int id; public string name; public int job; } [System.Serializable] public class PlayersContainer { public List<PlayerInfo> Player; } ``` 注意这里使用了 `[System.Serializable]` 属性标记以便让 `JsonUtility` 能够识别并序列化/反序列化这些字段[^3]。 #### 使用 JsonUtility 进行解析 有了合适的类型之后就可以调用 `JsonUtility.FromJson<PlayersContainer>(jsonString)` 将 JSON 字符串转换成 C# 实体实例了。这表明即使是对复杂嵌套的对象集合形式,只要遵循特定规则构建好映射关系,`JsonUtility` 同样能有效完成解析工作[^4]。 然而值得注意的是,尽管 `JsonUtility` 可以很好地应对大多数情况下的简单到复杂的 JSON 数据,但对于某些高级特性(比如泛型或者更灵活的数据绑定),可能还需要借助其他库如 Newtonsoft.Json 才能满足需求[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值