Unity C# 读取安卓persistentDataPath目录中的json文件
一.声明需要用到的命名空间
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文件相关推荐
- 计算机目录读取,从项目目录中读取SQL查询文件(Read SQL query file from project directory)...
从项目目录中读取SQL查询文件(Read SQL query file from project directory) 我在Visual Studio项目中放置了3个特别大的SQL查询,位于项目目录中 ...
- C# 读取指定目录中的所有文件,并按规则生成SQL语句!
本实例的目的在于: 1 了解如何遍历指定目录中的所有文件 2 控制台如何输入和输出数据 代码: using System; using System.IO;namespace ToSql{ class ...
- Android开发 ---如何操作资源目录中的资源文件2
Android开发 ---如何操作资源目录中的资源文件2 一.颜色资源管理 效果图: 描述: 1.改变字体的背景颜色 2.改变字体颜色 3.改变按钮颜色 4.图像颜色切换 操作描述: 点击(1)中的颜 ...
- java zip 创建目录_Java实现Zip压缩目录中的所有文件
java中将一个文件夹下所有的文件压缩成一个文件,然import java.io.*; import java.util.zip.*; public class CompressD { // 缓冲 s ...
- 安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开
安卓从服务器中下载pdf文件 然后调用第三方软件WPS Office打开 前提: 高版本想使用Uri.fromFile() file://的形式 需要在onCreate 或init方法中添加下面代码. ...
- python模糊查找文件夹名字_python实现在目录中查找指定文件的方法
本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 复制代码 代码如下: import os from glob import glob ...
- 在Python中以扩展名.txt查找目录中的所有文件
如何在python中扩展名为.txt的目录中找到所有文件? #1楼 import os import sys if len(sys.argv)==2:print('no params')sys.exi ...
- python 查找指定文件_python实现在目录中查找指定文件的方法
本文实例讲述了python实现在目录中查找指定文件的方法.分享给大家供大家参考.具体实现方法如下: 1. 模糊查找 代码如下: import os from glob import glob #用到了 ...
- go errgroup 递归搜索目录中的Go文件
为了测试sync.ErrGroup的所有功能,我写了一个小程序,用一个指定的模式递归搜索目录中的Go文件.这有助于在Go源代码树中查找已使用已弃用或更新的包的实例.要测试sync.ErrGroup的所 ...
最新文章
- Swift中页面跳转与传值:
- TCP为什么是3次握手?
- java中创建两种线程的方式_java中创建线程的两种方式有什么区别?
- 一文看懂数据预处理最重要的3种思想和方法
- go依赖管理-govendor
- Oracle 20c 新特性:缺省的只读 Oracle HOME 支持
- Scala入门到精通——第五节 函数与闭包
- 计算机操作师初级理论知识试卷答案,[计算机操作员初级理论知识试卷1.doc
- 告别后端!阿里云小程序 Serverless 教你如何 30 分钟开发小程序!
- Paramiko模块(堡垒机)
- 资源 | 忘了Python关键语句?这份备忘录拯救你的记忆
- 190523每日一句
- iOS 点击图片放大效果
- python 培训线下
- 弱口令介绍及破解方式
- Unirech腾讯云国际版代充-使用RDP文件登录到Windows云服务器实例教程
- win7系统下安装LINUX系统教程
- 关于ABAP中锁参数SCOPE的使用bug一粒
- python爬取豆瓣电影top250_用Python爬取豆瓣电影TOP250分析
- [LeetCode] Sqrt(int x)解题报告之无限逼近(牛顿法)