Unity中读取Json文件:基于Assets/Resources文件夹

这篇具有很好参考价值的文章主要介绍了Unity中读取Json文件:基于Assets/Resources文件夹。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

我好生气😤,Python,JS里面一两行代码能够搞定的Json读取,在Unity中使用C#读取Json文件超多坑,爬出来一个又来一个。

主要是JsonUtility.FromJson太不给力了。

最好的方式是,使用 https://github.com/jilleJr/Newtonsoft.Json-for-Unity 这个第三方库。详情见下。

在UnityEditor中运行程序时,如何读取Json

  • Step 1: 先把对应的Json File放到 Assets/Resources 里面,假设该Json File的名字为:“my_file.json”
  • Step 2: 对应着Json Object的格式,声明一个对应的类,例如:
[System.Serializable]
public class CustomerInfo
{
    public string application_id;
    public string assigned_staff;
    public float arrive_time;
    public float starting_process_time;
    public float finish_time;
}

[System.Serializable]
public class CustomerInfoList
{
    public List<CustomerInfo> customerApplications = new List<CustomerInfo>();
}

这里是第一个坑,[System.Serializable] 必不可少,否则无法JsonUtility无法解析。见文档说明:

Internally, this method uses the Unity serializer; therefore the type you are creating must be supported by the serializer. It must be a plain class/struct marked with the Serializable attribute. Fields of the object must have types supported by the serializer. Fields that have unsupported types, as well as private fields or fields marked with the NonSerialized attribute, will be ignored.

  • Step 3: 使用Resources.Load读取Json File,详见文档
TextAsset jsonFile = Resources.Load<TextAsset>("my_file"); // 不需要.json 后缀
string jsonString = jsonFile.text

jsonString 案例:

“[ { “application_id”: “app_1”, “assigned_staff”: “staff_1”, “arrive_time”: 1, “starting_process_time”: 3, “finish_time”: 5 }, { “application_id”: “app_2”, “assigned_staff”: “staff_2”, “arrive_time”: 2, “starting_process_time”: 4, “finish_time”: 6 } ]”

  • Step 4: 然后就是解析这个jsonString了。我试了有三种方法,
    • 一个是使用Unity 提供的 JsonUtility.FromJson。 这里超多坑,不知道照着教程写的代码为什么会有类似于not serialzable的报错

      • (几天后的更新): 我知道为什么了😆!! JsonUtility.FromJson只能读取Json Object,当Json文件中包含的实际上是Json Array时,就会出错。正确的方式是
        • 在Step 2中,定义一个Container,

          [System.Serializable]
          public class CustomerInfoList
          {
          public List customerApplications = new List();
          }

        • 读取时,需要在上面的jsonString外面套一层“皮”,把Array变成Object

          CustomerInfoList customerList = JsonUtility.FromJson(“{“customerApplications” :” +jsonString + “}”);
          List customerApplication = customerList.customerApplications;

          在上面代码中,“{“customerApplications” :” 就是为了在jsonString套一层皮。其实 CustomerInfoList 这个类,也是在List()套了一层皮,所以CustomerInfoList里面是customerApplications,JsonUtility.FromJson 里面写的也是customerApplications.

    • 一个是使用第三方的库,例如Json.Net, 但是安装包好麻烦呀。

      • (几天后的更新) JsonUtility.FromUtility真的太鸡肋了。如果Json文件里面含有复杂的数据结构,例如List, 或者List<List> 这种,就无法解析,因此还是逃不过使用第三方库。
      • 仔细看了一下文档,安装其实也很简单(主要是文档写得密密麻麻的😤
      • 使用Json.Net(又名Newtonsoft.Json)解析各种Json的步骤:
        • 安装:见文档
        • 代码:

[System.Serializable]
public class StaffWithAssignedApplications
{
    public string staff_id;
    public List<List<string>> assigned_application_list_at_each_interval;

    public Vector3 position;
}

[System.Serializable]
public class StaffContainer
{
    public List<StaffWithAssignedApplications> staffs;
}

// 使用Networking.Json进行解析
using Newtonsoft.Json;

TextAsset jsonFile = Resources.Load<TextAsset>(fileName);
 StaffContainer staffContainer = JsonConvert.DeserializeObject<StaffContainer>("{\"staffs\":" + jsonFile.text + "}");

  • 第三种方法是自己手写了简单的解析器,但是不够可拓展。
using System.Collections.Generic;
using System.Text.RegularExpressions;

public static List<T> ParseJsonArray<T>(string json)
{
    var regex = new Regex(@"\{(.+?)\}");
    var matches = regex.Matches(json);

    var list = new List<T>();

    foreach (Match match in matches)
    {
        var itemJson = "{" + match.Groups[1].Value + "}";
        var item = JsonUtility.FromJson<T>(itemJson);
        list.Add(item);
    }

    return list;
}


// 调用:
List<CustomerInfo> finalResults = ParseJsonArray<CustomerInfo>(jsonString);

运行在Oculus或者手机上的程序,如何读取?

未完待续

总结Unity中读取Json文件的坑

  1. JsonUtility.FromJson 太鸡肋了,解析不了复杂的Json,直接放弃吧。使用Newtonsoft.Json
  2. 无论是JsonUtility.FromJson,还是Newtonsoft.Json(?这个待查证),都只能直接读取Json Object
{"key":value}

如果是

[{"key":value},{"key":value},...]

这种形式,则读取的时候需要在外面套层皮:文章来源地址https://www.toymoban.com/news/detail-652260.html

{
"outkey": [{"key":value},{"key":value},...]
}
  1. 定义与Json Object相关的类的时候,需要加上System.Serializable

到了这里,关于Unity中读取Json文件:基于Assets/Resources文件夹的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 如何在Android studio中快速创建raw和assets文件夹

    1. 创建raw文件夹 切成project浏览模式——找到res文件粘贴要放入raw文件夹下的文件。 当然此时raw文件还没有,直接在右侧输入框中出现的路径~res后面加上raw即可。 2. 创建assets文件夹 同理在main文件夹下粘贴要放入assets文件夹的文件,添加对应的assets路径即可生成。 路径很难

    2024年02月06日
    浏览(33)
  • IDEA创建Spring,Maven项目没有resources文件夹

    有时新建Spring或Maven项目时,会出现目录中main下无resources文件夹的情况,来一起解决一下: FIles|Project Structure 在Modules模块找到对应路径,在main下创建resources,右键main,选择新文件夹 输入文件名resources,点击OK 找到刚才创建的文件夹,右键,选择设置为Resources 点击Apply,O

    2024年02月11日
    浏览(57)
  • Unity Android 之 读取下载获取移动端 sdcard 路径下的指定文件夹的所有图片的几种方式的简单整理

    目录 Unity Android 之 读取下载获取移动端 sdcard 路径下的指定文件夹的所有图片的几种方式的简单整理 一、简单介绍 二、实现原理 三、注意事项 四、简单实现步骤 五、关键代码 附录: 一、不同平台使用宏区分路径加载 二、Unity3D中的资源路径 三、Unity3D各平台路径(包括手

    2024年01月19日
    浏览(52)
  • python读取文件夹下的文件以及子文件夹中文件

    os.listdir() 读取目标文件夹下的文件名和子文件夹名,不会递归读取子文件夹下 方法一: root, dirs, files = os.walk() 递归读取文件夹和 子文件夹下所有文件 。方法二:也可以用os.listdir(),判断是文件夹再os.listdir()自己写一个递归程序 示例

    2024年02月16日
    浏览(45)
  • python 读取文件夹下子文件夹下的csv数据表

    可以使用 Python 中的  os  和  csv  模块来读取文件夹下的文件夹的 csv 数据。具体的步骤如下: 导入  os  和  csv  模块。 使用  os  模块的  listdir  函数列举出目标文件夹下的所有子文件夹的名称。 对于每个子文件夹,列举出其中的所有 .csv 文件的名称,并逐一读取 csv

    2024年02月11日
    浏览(55)
  • c#关于文件夹/文件/文本读取遍历,写入还有表格的读取的一些方法

    c#遍历文件夹下的各种文件 将一些log写入到文本文件中: fs.Seek(offset, whence);移动文件读取的指针到指定位置 offset:开始的偏移量,也就是代表需要移动偏移的字节数 whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始

    2024年02月01日
    浏览(35)
  • matlab 读取某一文件夹下的文件

    MATLAB 是一个十分强大的科学计算软件,用于各种数据分析和科学计算。在实际工作和研究过程中,我们通常将数据存储在文件中,文件存在于系统的某个目录中。如果需要读取这些文件,可以使用 MATLAB 提供的文件和文件夹操作函数。本文将介绍如何使用 MATLAB 读取文件夹中

    2024年02月16日
    浏览(35)
  • MATLAB自动读取文件夹中的所有文件,并处理文件内容

    1.实现matlab自动读取某文件夹内的所有同类型文件; 2.实现处理读取到的文件内容,本文实现找出文件中数据最大值以及最大值的位置; 3.实现将找出的数据最大值以及最大值的位置自动写入txt文件中,本文是存放在fengzhi.txt文件中; 4.因我需要读取的文件数量相当大,为了减

    2024年02月15日
    浏览(32)
  • 微信小程序文件相关操作(新建文件夹、下载、解压、读取等)

    wx.downloadFile()  //下载 wx.getFileSystemManager()  //获取小程序的文件管理器 FileSystemManager.unzip() //解压 FileSystemManager.readdir()  //读取文件夹 FileSystemManager.readFile()  //读取文件 FileSystemManager.access() //判断文件/目录是否存在 FileSystemManager.mkdir()  //创建文件夹 index.js 在 onload 中获取 F

    2024年02月15日
    浏览(30)
  • C语言读取文件夹一级子目录的指定类型文件

    参考链接: C语言读取指定文件夹下的所有文件(各种信息)_c语言读取文件夹下的所有文件-CSDN博客  参考以上文案,做成了几个函数,用于读取任意文件夹下的指定后缀的文件。

    2024年02月21日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包