Unity 读取Json常用的几种方式

Unity中读取StreamingAssets文件夹内Json文件的多种方法
这篇博客介绍了在Unity引擎中通过UnityWebRequest和StreamReader等不同方式读取本地StreamingAssets文件夹内的Json文件,包括解决安卓端权限问题的方法,以及在不同平台下的路径调整。

使用的命名空间如下
using LitJson;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

注意:安卓路径
本地路径:“/storage/emulated/0/” + fileName;
安装后:Application.persistentDataPath

注意事项:

安卓端运行apk提示”UnauthorizedAccessException:Access to the path “/xx/xx.xx” is denied.“
解决方法 ①在AndroidManifest.xml中的application标签中添加:android:requestLegacyExternalStorage=“true”
    ②安装在安卓手机上apk软件,需要设置软件权限管理,将读写设备存储改成始终允许

1、通过UnityWebRequest获取本地StreamingAssets文件夹中的Json文件

      /// <summary>
    /// 通过UnityWebRequest获取本地StreamingAssets文件夹中的Json文件
    /// </summary>
    /// <param name="fileName">文件名称</param>
    /// <returns></returns>
    public string UnityWebRequestJsonString(string fileName)
    {
   
   
        string url;

        #region 分平台判断 StreamingAssets 路径
        //如果在编译器 或者 单机中  ……
#if UNITY_EDITOR || UNITY_STANDALONE

        url = "file://" + Application.dataPath + "/StreamingAssets/" + fileName;
        //否则如果在Iphone下……
#elif UNITY_IPHONE

            url = "file://" + Application.dataPath + "/Raw/"+ fileName;
            //否则如果在android下……
#elif UNITY_ANDROID
            url = "jar:file://" + Application.dataPath + "!/assets/"+ fileName;
#endif
        #endregion
        UnityWebRequest request = UnityWebRequest.Get(url);
        request.SendWebRequest();//读取数据
        while (true)
        {
   
   
            if (request.downloadHandler.isDone)//是否读取完数据
            {
   
   
                return request
Unity中,将JSON文件读取并转换为集合或数组可以通过以下几种方式实现: #### 使用JsonUtility JsonUtility是Unity内置的JSON处理工具,但它无法直接读取数据集合,需要进行包装。 示例代码如下: ```csharp using UnityEngine; using System.IO; using System.Collections.Generic; // 定义角色信息类 [System.Serializable] public class RoleInfo { public int hp; public int speed; public int volume; public string resName; public int scale; } // 定义包装类 [System.Serializable] public class RoleData { public List<RoleInfo> list; } public class JsonReadExample : MonoBehaviour { void Start() { // 读取JSON文件 string jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo2.json"); // 将JSON字符串反序列化为包装类对象 RoleData data = JsonUtility.FromJson<RoleData>(jsonStr); // 获取角色信息列表 List<RoleInfo> roleInfoList = data.list; } } ``` 需要注意的是,自定义类需要加上序列化特性`[System.Serializable]`,JSON文档编码格式必须是UTF - 8,且JsonUtility不支持字典,不能直接将数据反序列化为数据集合[^1]。 #### 使用LitJson LitJson是一个轻量级的JSON处理库,可用于解析JSON字符串并将其转换为对象。 示例代码如下: ```csharp using UnityEngine; using LitJson; using System.IO; using System.Collections.Generic; // 定义角色信息类 public class RoleInfo { public int hp; public int speed; public int volume; public string resName; public int scale; } public class LitJsonExample : MonoBehaviour { void Start() { // 读取JSON文件 string jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo2.json"); // 解析JSON字符串为JsonData对象 JsonData jsonData = JsonMapper.ToObject(jsonStr); // 创建角色信息列表 List<RoleInfo> roleInfoList = new List<RoleInfo>(); // 遍历JsonData对象 for (int i = 0; i < jsonData.Count; i++) { RoleInfo roleInfo = new RoleInfo(); roleInfo.hp = (int)jsonData[i]["hp"]; roleInfo.speed = (int)jsonData[i]["speed"]; roleInfo.volume = (int)jsonData[i]["volume"]; roleInfo.resName = (string)jsonData[i]["resName"]; roleInfo.scale = (int)jsonData[i]["scale"]; roleInfoList.Add(roleInfo); } } } ``` 使用`JsonMapper.ToObject`方法可以将JSON字符串解析为`JsonData`对象,然后根据需要提取数据并转换为集合或数组[^2]。 #### 使用Newtonsoft.Json Newtonsoft.Json是一个功能强大的JSON处理库,支持复杂的JSON数据结构。 示例代码如下: ```csharp using UnityEngine; using Newtonsoft.Json; using System.IO; using System.Collections.Generic; // 定义角色信息类 public class RoleInfo { public int hp; public int speed; public int volume; public string resName; public int scale; } public class NewtonsoftJsonExample : MonoBehaviour { void Start() { // 读取JSON文件 string jsonStr = File.ReadAllText(Application.streamingAssetsPath + "/RoleInfo2.json"); // 将JSON字符串反序列化为角色信息列表 List<RoleInfo> roleInfoList = JsonConvert.DeserializeObject<List<RoleInfo>>(jsonStr); } } ``` 使用`JsonConvert.DeserializeObject`方法可以直接将JSON字符串反序列化为集合或数组。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值