一.声明需要用到的命名空间

using LitJson;       //用于读取Json文件
using System.IO;  //用于声明StreamReader类                                      

using System;      //用于声明序列化


二.编辑Json文件

1.电脑中创建一个Text文本,命名为 TextData

2.填写Json内容

例:

整个json内容用{}圈起

SubjectData 和TeacherStudentDialogueData 是:类  内容用 [ ]  圈起

类中每个{}中的所有内容是:组   可以有多个

组{}中的每一行是:项    变量名和数量要保持一致

类,组,项 每添加一个要在上个的结尾添加 逗号 " , " 最后的类,组,项不需要添加都好

类,组,项 ,索引是从0开始

{
"SubjectData":[
{
"Questions":"让角色移动10步的指令属于哪一类的代码功能?",
"AnswerA"  :"外观",
"AnswerB"  :"运动",
"AnswerC"  :"控制",
"RightAnswer":"运动",
"Keyword1":"角色",
"Keyword2":"移动",
"Keyword3":"代码"
},
{
"Questions":"如何让程序开始运行?",
"AnswerA" :"点击绿旗",
"AnswerB" :"按下空格键",
"AnswerC" :"点击红色按钮",
"RightAnswer":"点击绿旗",
"Keyword1":"如何",
"Keyword2":"程序",
"Keyword3":"运行"
}
],
"TeacherStudentDialogueData":[
{
"TeacherDialogue":"上课",
"StudentDialogue":"起立",
"Keyword1":"上课",
"Keyword2":"",
"Keyword3":""
},
{
"TeacherDialogue":"请坐",
"StudentDialogue":"老师好",
"Keyword1":"请坐",
"Keyword2":"",
"Keyword3":""
},
{
"TeacherDialogue":"好,下课了",
"StudentDialogue":"老师再见",
"Keyword1":"好",
"Keyword2":"下课",
"Keyword3":""
}
]
}

3.填写完成后复制整段内容到 https://www.json.cn/ 这个网站去验证编辑的是否正确,如果正确,网站中会显示正确翻译内容,不正确会有错误提示

4.编辑完成,保存, 将文本的text格式改为json格式文件


三.C#脚本声明Json类

1. json文件中有多少个类,C#脚本中就声明多少个类,C#脚本名和类名无关

2.每个类都要添加序列化索引[Serializable]不然读取不到

3.类名 组中每一项的变量名都要与Json文件中的类名和项的变量名保持一致,不然读取不到,注意大小写

4.类和组中的变量修饰符都为Public,数据类型为String

5.声明一个存储类,用于存储json文件中 指定类中每一组的数据,即下面脚本中的Root,注意 泛函数的数据类型与声明的数据类保持一致

6.如果发现哪一项数据内容没读取到,那大概率就是那一项的变量名没写对

例:

/// <summary>
/// 题目和答案
/// </summary>
[Serializable]
public class SubjectData
{public string Questions;//题目public string AnswerA;//选项Apublic string AnswerB;//选项Bpublic string AnswerC;//选项Cpublic string RightAnswer;//正确答案public string Keyword1;//关键字1public string Keyword2;//关键字2public string Keyword3;//关键字3
}/// <summary>
/// 课堂上本人的对话
/// </summary>
[Serializable]
public class TeacherStudentDialogueData
{public string TeacherDialogue;//老师的对话public string StudentDialogue;//学生的对话public string Keyword1;//关键字1public string Keyword2;//关键字2public string Keyword3;//关键字3}/// <summary>
/// 存储分类数据
/// </summary>
[Serializable]
public class Root
{public List<SubjectData> SubjectData;public List<TeacherStudentDialogueData> TeacherStudentDialogueData;
}

7.在读取Json文件的脚本中声明存储类

声明写在继承MonoBehaviour的脚本

//声明存储类public  Root root;

如果在同一个脚本只需要声明就行,不需要实例化


 四.Json文件放置位置

文件的放置路径为:此电脑\设备存储路径\Android\data\安卓软件包名\files

此文件路径就是 安卓persistentDataPath目录 也叫安卓沙盒目录或 安卓本地化持久目录

脚本读取这个路径时,指定代码为:Application.persistentDataPath

这个文件夹是可供我们的读取和修改。

将Json放入files文件夹中,如果json文件过多,建议单独建一个文件夹

文件路径在第一次安装时是没有的,要安装好软件,打开软件,运行一次再退出,才会有。


五. 读取persistentDataPath目录中的json文件两种方法

  • 方法一  C# StreamReader 类读取

就这一行代码就读取到了, 读取到后接下来就是转换数据的内容了


// 声明一个读取文件类                          沙盒文件路径+Json文件名.json
StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");

测试时:

在PC端Unity上运行时,为方便测试可以将路径换成 Application.streamingAssetsPath + "/" + "TextData.json,这时就可以在PC端上直接读取Json文件

streamingAssetsPath文件夹是只能读取,不可写入

将Json文件放入Unity文件面板中的StreamingAssets 文件夹即可,注意文件名一定要一致

一般在StreamingAsset文件夹中读取到,在安卓环境中也可以读取到

真机运行时:

文件路径改为:Application.persistentDataPath

脚本方法一:

 #region 读取安卓本地持久化目录中的json文件/// <summary>/// 读取安卓Application.persistentDataPath目录中的json文件/// </summary>public void GetJsonData(){//测试时使用,读取StreamingAssets文件夹中指定json文件数据,,//StreamReader streamReader = new StreamReader( Application.streamingAssetsPath + "/" + "TextData.json");//读取指定文件夹中指定json文件数据StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");//转换json数据JsonReader js = new JsonReader(streamReader);//将数据赋值到Root类root = JsonMapper.ToObject<Root>(js);//读取//关闭数据流streamReader.Close();}#endregion

注意:此方法需要用到LitJson 插件,声明using LitJson命名空间;

而且要将Json数据Debug.log不报错打印出来会有些繁琐,还要加一行

string srRTE = streamReader.ReadToEnd();

进行数据流到字符串的转换,然后再将

JsonReader js = new JsonReader(streamReader);//删除这一行代码

变更这行代码参数root = JsonMapper.ToObject<Root>(srRTE);//读取;

脚本方法二:

 public void GetJsonData2(){//测试时使用,读取StreamingAssets文件夹中指定json文件数据,,StreamReader streamReader = new StreamReader(Application.streamingAssetsPath + "/" + "TextData.json");//读取指定文件夹中指定json文件数据//StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");//读取来自流的当前位置到结尾的所有字符。string srRTE = streamReader.ReadToEnd();//打印字符串数据Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + srRTE);//将Json数据字符串赋值到Root类root = JsonUtility.FromJson<Root>(srRTE);//关闭数据流streamReader.Close();}

注意:此方法采用Unity自带的Json读取方法,不需要litJson插件,不需要声明 using LitJson命名空间;,可以Debug.log()打印内容但功能没有Json插件多

  • 方法二 C# UnityWebRequest类 Web服务器通信方式读取

/// <summary>/// 读取安卓Application.persistentDataPath目录中的json文件/// Web服务器通信方式/// </summary>/// <returns></returns>IEnumerator GetJsonData3_IE(){//测试时使用,读取StreamingAssets文件夹中指定json文件数据//UnityWebRequest request = UnityWebRequest.Get("file://" + Application.streamingAssetsPath + "/" + "TextData.json");//读取指定文件夹中指定json文件数据UnityWebRequest request = UnityWebRequest.Get("file://" + Application.persistentDataPath + "/" + "TextData.json");//开始与远程服务器通信。开始与安卓本地文件夹通信。成功后进入下一步yield return request.SendWebRequest();//打印返回系统从远程服务器下载的主体数据的字节数。(只读)Debug.Log("<color=#ff7f00>" + "Json配置文件数据字节数:" + "</color>" + request.downloadedBytes);//打印字符串数据//拥有对 DownloadHandler 对象的引用,该对象可管理此 UnityWebRequest 从远程服务器接收的主体数据。Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + request.downloadHandler.text);//将Json数据字符串赋值到Root类//通过 JSON 表示形式创建对象。root = JsonUtility.FromJson<Root>(request.downloadHandler.text); }

注意: "jar:file://" +Application.persistentDataPath + "/" + "TextData.json"  这个路径是读取apk包里面的资源,不是安装好的软件不是读取本地持久化目录的里面的东西。

这三种脚本方法调用在Awake中就行,携程方法记得开启:StartCoroutine(GetJsonData3_IE());


六.调用存储到Root类中的数据

1.声明Root类

//存放Json数据public  Root root;
//不需要实例化

如果想要在其他脚本中引用Root类,

先在其他脚本中声明这个类再在其他脚本中赋值这个脚本中的类,

不可以直接实例化这个类,这么做只会实例化一个空数据

例:

//其他脚本中引用Root类
public class GameObject_School : MonoBehaviour
{public Root root;//Json 数据存放void Start(){//其他脚本引用Root类数据//含有数据的Root类,在读取JSon脚本中root =ConfigurationLoad_school.Instance.root;}
}

2.调用类中的数据

获取Json文件指定类中组的数量

//获取Json数据指定类中组的数量
//返回int类型
//数据存储类.泛型数组.总数
root.SubjectData.Count//获取指定项的内容
//返回String 类型
//数据存储类.泛型数组指定索引.指定项
//数据存储类.Json数据中指定类中的索引组.项
root.SubjectData[i].AnswerA;
root.TeacherStudentDialogueData[i].TeacherDialogue

七.附整体代码:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;
using System.IO;
using UnityEngine.UI;
using UnityEngine.Networking;
using System;/// <summary>
/// 题目和答案
/// </summary>
[Serializable]
public class SubjectData
{public string Questions;//题目public string AnswerA;//选项Apublic string AnswerB;//选项Bpublic string AnswerC;//选项Cpublic string RightAnswer;//正确答案public string Keyword1;//关键字1public string Keyword2;//关键字2public string Keyword3;//关键字3
}/// <summary>
/// 课堂上本人的对话
/// </summary>
[Serializable]
public class TeacherStudentDialogueData
{public string TeacherDialogue;//老师的对话public string StudentDialogue;//学生的对话public string Keyword1;//关键字1public string Keyword2;//关键字2public string Keyword3;//关键字3}/// <summary>
/// 存储分类数据
/// </summary>
[Serializable]
public class Root
{public List<SubjectData> SubjectData;public List<TeacherStudentDialogueData> TeacherStudentDialogueData;
}public class ConfigurationLoad_school : MonoBehaviour
{public static ConfigurationLoad_school Instance;public  Root root;private void Awake(){Instance = this;//喜欢那种方法就调用哪种方法GetJsonData();//GetJsonData2();//StartCoroutine(GetJsonData3_IE());}public void Start(){}#region 读取安卓本地持久化目录中的json文件/// <summary>/// 读取安卓Application.persistentDataPath目录中的json文件/// </summary>public void GetJsonData(){//测试时使用,读取StreamingAssets文件夹中指定json文件数据,,StreamReader streamReader = new StreamReader( Application.streamingAssetsPath + "/" + "TextData.json");//读取指定文件夹中指定json文件数据//StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");//转换json数据JsonReader js = new JsonReader(streamReader);//将数据赋值到Root类root = JsonMapper.ToObject<Root>(js);//读取//关闭数据流streamReader.Close();}/// <summary>/// 读取安卓Application.persistentDataPath目录中的json文件/// 自己改编/// </summary>public void GetJsonData2(){//测试时使用,读取StreamingAssets文件夹中指定json文件数据StreamReader streamReader = new StreamReader(Application.streamingAssetsPath + "/" + "TextData.json");//读取指定文件夹中指定json文件数据//StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");//读取来自流的当前位置到结尾的所有字符。string srRTE = streamReader.ReadToEnd();//打印字符串数据Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + srRTE);//将Json数据字符串赋值到Root类root = JsonUtility.FromJson<Root>(srRTE);//关闭数据流streamReader.Close();}/// <summary>/// 读取安卓Application.persistentDataPath目录中的json文件/// Web服务器通信方式/// </summary>/// <returns></returns>IEnumerator GetJsonData3_IE(){//测试时使用,读取StreamingAssets文件夹中指定json文件数据UnityWebRequest request = UnityWebRequest.Get("file://" + Application.streamingAssetsPath + "/" + "TextData.json");//读取指定文件夹中指定json文件数据//UnityWebRequest request = UnityWebRequest.Get("file://" + Application.persistentDataPath + "/" + "TextData.json");//开始与远程服务器通信。开始与安卓本地文件夹通信。成功后进入下一步yield return request.SendWebRequest();//打印返回系统从远程服务器下载的主体数据的字节数。(只读)Debug.Log("<color=#ff7f00>" + "Json配置文件数据字节数:" + "</color>" + request.downloadedBytes);//打印字符串数据//拥有对 DownloadHandler 对象的引用,该对象可管理此 UnityWebRequest 从远程服务器接收的主体数据。Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + request.downloadHandler.text);//将Json数据字符串赋值到Root类//通过 JSON 表示形式创建对象。root = JsonUtility.FromJson<Root>(request.downloadHandler.text); }#endregion}

Unity C# 读取安卓persistentDataPath目录中的json文件相关推荐

  1. 计算机目录读取,从项目目录中读取SQL查询文件(Read SQL query file from project directory)...

    从项目目录中读取SQL查询文件(Read SQL query file from project directory) 我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中 ...

  2. C# 读取指定目录中的所有文件,并按规则生成SQL语句!

    本实例的目的在于: 1 了解如何遍历指定目录中的所有文件 2 控制台如何输入和输出数据 代码: using System; using System.IO;namespace ToSql{ class ...

  3. Android开发 ---如何操作资源目录中的资源文件2

    Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...

  4. java zip 创建目录_Java实现Zip压缩目录中的所有文件

    java中将一个文件夹下所有的文件压缩成一个文件,然import java.io.*; import java.util.zip.*; public class CompressD { // 缓冲 s ...

  5. 安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开

    安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开 前提: 高版本想使用Uri.fromFile() file://的形式 需要在onCreate 或init方法中添加下面代码. ...

  6. python模糊查找文件夹名字_python实现在目录中查找指定文件的方法

    本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 复制代码 代码如下: import os from glob import glob ...

  7. 在Python中以扩展名.txt查找目录中的所有文件

    如何在python中扩展名为.txt的目录中找到所有文件? #1楼 import os import sys if len(sys.argv)==2:print('no params')sys.exi ...

  8. python 查找指定文件_python实现在目录中查找指定文件的方法

    本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from glob import glob #用到了 ...

  9. go errgroup 递归搜索目录中的Go文件

    为了测试sync.ErrGroup的所有功能,我写了一个小程序,用一个指定的模式递归搜索目录中的Go文件.这有助于在Go源代码树中查找已使用已弃用或更新的包的实例.要测试sync.ErrGroup的所 ...

最新文章

  1. Swift中页面跳转与传值:
  2. TCP为什么是3次握手?
  3. java中创建两种线程的方式_java中创建线程的两种方式有什么区别?
  4. 一文看懂数据预处理最重要的3种思想和方法
  5. go依赖管理-govendor
  6. Oracle 20c 新特性:缺省的只读 Oracle HOME 支持
  7. Scala入门到精通——第五节 函数与闭包
  8. 计算机操作师初级理论知识试卷答案,[计算机操作员初级理论知识试卷1.doc
  9. 告别后端!阿里云小程序 Serverless 教你如何 30 分钟开发小程序!
  10. Paramiko模块(堡垒机)
  11. 资源 | 忘了Python关键语句?这份备忘录拯救你的记忆
  12. 190523每日一句
  13. iOS 点击图片放大效果
  14. python 培训线下
  15. 弱口令介绍及破解方式
  16. Unirech腾讯云国际版代充-使用RDP文件登录到Windows云服务器实例教程
  17. win7系统下安装LINUX系统教程
  18. 关于ABAP中锁参数SCOPE的使用bug一粒
  19. python爬取豆瓣电影top250_用Python爬取豆瓣电影TOP250分析
  20. [LeetCode] Sqrt(int x)解题报告之无限逼近(牛顿法)

热门文章

  1. 怎么做才能有效的进行App推广呢?
  2. 非常不错的AI聊天互动平台 AI EDU
  3. vue 路由警告 Duplicate named routes definition
  4. 【MySQL】设置好友关系(关注、粉丝、互关)的数据库设计
  5. 在Linux上高效开发的7个建议
  6. 【安卓学习笔记】Android Handler 消息机制探究
  7. 利用Anaconda Navigator打包python文件为exe格式的方法
  8. web渗透之文件上传漏洞知识总结
  9. logstash+elastic+kibana日志管理工具介绍及安装
  10. 2021行车记录仪什么牌子质量好