当前位置:   UNITY > 正文

Unity C# 读取安卓persistentDataPath目录中的json文件

persistentdatapath

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

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

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


二.编辑Json文件

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

  2.填写Json内容

例:

整个json内容用{}圈起

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

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

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

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

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

  1. {
  2. "SubjectData":[
  3. {
  4. "Questions":"让角色移动10步的指令属于哪一类的代码功能?",
  5. "AnswerA" :"外观",
  6. "AnswerB" :"运动",
  7. "AnswerC" :"控制",
  8. "RightAnswer":"运动",
  9. "Keyword1":"角色",
  10. "Keyword2":"移动",
  11. "Keyword3":"代码"
  12. },
  13. {
  14. "Questions":"如何让程序开始运行?",
  15. "AnswerA" :"点击绿旗",
  16. "AnswerB" :"按下空格键",
  17. "AnswerC" :"点击红色按钮",
  18. "RightAnswer":"点击绿旗",
  19. "Keyword1":"如何",
  20. "Keyword2":"程序",
  21. "Keyword3":"运行"
  22. }
  23. ],
  24. "TeacherStudentDialogueData":[
  25. {
  26. "TeacherDialogue":"上课",
  27. "StudentDialogue":"起立",
  28. "Keyword1":"上课",
  29. "Keyword2":"",
  30. "Keyword3":""
  31. },
  32. {
  33. "TeacherDialogue":"请坐",
  34. "StudentDialogue":"老师好",
  35. "Keyword1":"请坐",
  36. "Keyword2":"",
  37. "Keyword3":""
  38. },
  39. {
  40. "TeacherDialogue":"好,下课了",
  41. "StudentDialogue":"老师再见",
  42. "Keyword1":"好",
  43. "Keyword2":"下课",
  44. "Keyword3":""
  45. }
  46. ]
  47. }

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.如果发现哪一项数据内容没读取到,那大概率就是那一项的变量名没写对

例:

  1. /// <summary>
  2. /// 题目和答案
  3. /// </summary>
  4. [Serializable]
  5. public class SubjectData
  6. {
  7. public string Questions;//题目
  8. public string AnswerA;//选项A
  9. public string AnswerB;//选项B
  10. public string AnswerC;//选项C
  11. public string RightAnswer;//正确答案
  12. public string Keyword1;//关键字1
  13. public string Keyword2;//关键字2
  14. public string Keyword3;//关键字3
  15. }
  16. /// <summary>
  17. /// 课堂上本人的对话
  18. /// </summary>
  19. [Serializable]
  20. public class TeacherStudentDialogueData
  21. {
  22. public string TeacherDialogue;//老师的对话
  23. public string StudentDialogue;//学生的对话
  24. public string Keyword1;//关键字1
  25. public string Keyword2;//关键字2
  26. public string Keyword3;//关键字3
  27. }
  28. /// <summary>
  29. /// 存储分类数据
  30. /// </summary>
  31. [Serializable]
  32. public class Root
  33. {
  34. public List<SubjectData> SubjectData;
  35. public List<TeacherStudentDialogueData> TeacherStudentDialogueData;
  36. }

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

声明写在继承MonoBehaviour的脚本

  1. //声明存储类
  2. public Root root;

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


 四.Json文件放置位置

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

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

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

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

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

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


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

  • 方法一  C# StreamReader 类读取

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

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

测试时: 

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

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

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

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

真机运行时:

文件路径改为:Application.persistentDataPath

脚本方法一:

  1. #region 读取安卓本地持久化目录中的json文件
  2. /// <summary>
  3. /// 读取安卓Application.persistentDataPath目录中的json文件
  4. /// </summary>
  5. public void GetJsonData()
  6. {
  7. //测试时使用,读取StreamingAssets文件夹中指定json文件数据,,
  8. //StreamReader streamReader = new StreamReader( Application.streamingAssetsPath + "/" + "TextData.json");
  9. //读取指定文件夹中指定json文件数据
  10. StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");
  11. //转换json数据
  12. JsonReader js = new JsonReader(streamReader);
  13. //将数据赋值到Root类
  14. root = JsonMapper.ToObject<Root>(js);//读取
  15. //关闭数据流
  16. streamReader.Close();
  17. }
  18. #endregion

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

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

 string srRTE = streamReader.ReadToEnd(); 

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

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

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

脚本方法二:

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

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

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

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

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

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


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

1.声明Root类

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

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

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

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

例:

  1. //其他脚本中引用Root类
  2. public class GameObject_School : MonoBehaviour
  3. {
  4. public Root root;//Json 数据存放
  5. void Start()
  6. {
  7. //其他脚本引用Root类数据
  8. //含有数据的Root类,在读取JSon脚本中
  9. root =ConfigurationLoad_school.Instance.root;
  10. }
  11. }

 2.调用类中的数据

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

  1. //获取Json数据指定类中组的数量
  2. //返回int类型
  3. //数据存储类.泛型数组.总数
  4. root.SubjectData.Count
  5. //获取指定项的内容
  6. //返回String 类型
  7. //数据存储类.泛型数组指定索引.指定项
  8. //数据存储类.Json数据中指定类中的索引组.项
  9. root.SubjectData[i].AnswerA;
  10. root.TeacherStudentDialogueData[i].TeacherDialogue

七.附整体代码: 

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using LitJson;
  5. using System.IO;
  6. using UnityEngine.UI;
  7. using UnityEngine.Networking;
  8. using System;
  9. /// <summary>
  10. /// 题目和答案
  11. /// </summary>
  12. [Serializable]
  13. public class SubjectData
  14. {
  15. public string Questions;//题目
  16. public string AnswerA;//选项A
  17. public string AnswerB;//选项B
  18. public string AnswerC;//选项C
  19. public string RightAnswer;//正确答案
  20. public string Keyword1;//关键字1
  21. public string Keyword2;//关键字2
  22. public string Keyword3;//关键字3
  23. }
  24. /// <summary>
  25. /// 课堂上本人的对话
  26. /// </summary>
  27. [Serializable]
  28. public class TeacherStudentDialogueData
  29. {
  30. public string TeacherDialogue;//老师的对话
  31. public string StudentDialogue;//学生的对话
  32. public string Keyword1;//关键字1
  33. public string Keyword2;//关键字2
  34. public string Keyword3;//关键字3
  35. }
  36. /// <summary>
  37. /// 存储分类数据
  38. /// </summary>
  39. [Serializable]
  40. public class Root
  41. {
  42. public List<SubjectData> SubjectData;
  43. public List<TeacherStudentDialogueData> TeacherStudentDialogueData;
  44. }
  45. public class ConfigurationLoad_school : MonoBehaviour
  46. {
  47. public static ConfigurationLoad_school Instance;
  48. public Root root;
  49. private void Awake()
  50. {
  51. Instance = this;
  52. //喜欢那种方法就调用哪种方法
  53. GetJsonData();
  54. //GetJsonData2();
  55. //StartCoroutine(GetJsonData3_IE());
  56. }
  57. public void Start()
  58. {
  59. }
  60. #region 读取安卓本地持久化目录中的json文件
  61. /// <summary>
  62. /// 读取安卓Application.persistentDataPath目录中的json文件
  63. /// </summary>
  64. public void GetJsonData()
  65. {
  66. //测试时使用,读取StreamingAssets文件夹中指定json文件数据,,
  67. StreamReader streamReader = new StreamReader( Application.streamingAssetsPath + "/" + "TextData.json");
  68. //读取指定文件夹中指定json文件数据
  69. //StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");
  70. //转换json数据
  71. JsonReader js = new JsonReader(streamReader);
  72. //将数据赋值到Root类
  73. root = JsonMapper.ToObject<Root>(js);//读取
  74. //关闭数据流
  75. streamReader.Close();
  76. }
  77. /// <summary>
  78. /// 读取安卓Application.persistentDataPath目录中的json文件
  79. /// 自己改编
  80. /// </summary>
  81. public void GetJsonData2()
  82. {
  83. //测试时使用,读取StreamingAssets文件夹中指定json文件数据
  84. StreamReader streamReader = new StreamReader(Application.streamingAssetsPath + "/" + "TextData.json");
  85. //读取指定文件夹中指定json文件数据
  86. //StreamReader streamReader = new StreamReader(Application.persistentDataPath + "/" + "TextData.json");
  87. //读取来自流的当前位置到结尾的所有字符。
  88. string srRTE = streamReader.ReadToEnd();
  89. //打印字符串数据
  90. Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + srRTE);
  91. //将Json数据字符串赋值到Root类
  92. root = JsonUtility.FromJson<Root>(srRTE);
  93. //关闭数据流
  94. streamReader.Close();
  95. }
  96. /// <summary>
  97. /// 读取安卓Application.persistentDataPath目录中的json文件
  98. /// Web服务器通信方式
  99. /// </summary>
  100. /// <returns></returns>
  101. IEnumerator GetJsonData3_IE()
  102. {
  103. //测试时使用,读取StreamingAssets文件夹中指定json文件数据
  104. UnityWebRequest request = UnityWebRequest.Get("file://" + Application.streamingAssetsPath + "/" + "TextData.json");
  105. //读取指定文件夹中指定json文件数据
  106. //UnityWebRequest request = UnityWebRequest.Get("file://" + Application.persistentDataPath + "/" + "TextData.json");
  107. //开始与远程服务器通信。开始与安卓本地文件夹通信。成功后进入下一步
  108. yield return request.SendWebRequest();
  109. //打印返回系统从远程服务器下载的主体数据的字节数。(只读)
  110. Debug.Log("<color=#ff7f00>" + "Json配置文件数据字节数:" + "</color>" + request.downloadedBytes);
  111. //打印字符串数据
  112. //拥有对 DownloadHandler 对象的引用,该对象可管理此 UnityWebRequest 从远程服务器接收的主体数据。
  113. Debug.Log("<color=#ff7f00>" + "Json配置文件内容:" + "</color>" + request.downloadHandler.text);
  114. //将Json数据字符串赋值到Root类
  115. //通过 JSON 表示形式创建对象。
  116. root = JsonUtility.FromJson<Root>(request.downloadHandler.text);
  117. }
  118. #endregion
  119. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/UNITY/detail/34624
推荐阅读
相关标签
  

闽ICP备14008679号