Json文件使用通过JsonUtility读取数据和储存数据
以图为例,读取向图片这样的数据信息和进行保存
1.读取图中的数据。
显而易见,这里面是一个InfoList变量里面储存着一堆变量pannelTypeString和path的数据。
我们进行读取的话,首先创建一个类,用来获取pannelTypeString和path的
using System;
//该信息需要声明为可序列化的
[Serializable]
//一定需要序列化
public class Info{
public string panelTypeString;
public string path;
//这些就是读取json的数据,储存在这,变量名要与json里面的一样(注,必须是public的)
//当然我们这里面可以定义其他的变量,但是如果不是json里面的变量
//,要么就设为非public,要不就加一个[NonSerialized],那么通过JsonUtility.FromJson读取时,就会忽略这些
}
在建立一个储存info信息的list
class dataAll
{
public List<Info> InfoList=new List<Info>();
}
然后创建一个unity脚本
在这里调用方法
void readJs()
{
//获取json文件的text
TextAsset t = Resources.Load<TextAsset>("UIPanelType");
//获取里面的所有string,传入一个序列化的数据类里面
dataAll data= JsonUtility.FromJson<dataAll>(t.text);
foreach(Info i in data.InfoList)
{
Debug.Log(i.path + " " + i.panelTypeString);
}
}
TextAsset.text:字符串形式的文件的文本内容。
TextAsset:文本文件资源。您可以将项目中的原始文本文件用作资源,通过此类获取其 内容。此外,如果要从二进制文件访问数据,可将这种文件作为原始字节数组进行访问。
JsonUtility.FromJson:可以查询api,我们可以知道
在api中,我们可以知道,前面必须使用的是Serializable属性标记。
在start里面调用该方法,就可以获取到信息
2.保存向图中数据一样储存
首先设置储存的路径
private string jsonPath = "Assets/Resources/Json.json";
void InitFile()
{
if (!File.Exists(jsonPath))
{
File.Create(jsonPath);//注意,创建这个东西的速度慢与后面读取的速度。
}
}
//在awake先调用InitFile,当没创建这个文件时,把文件创建好
private void Awake()
{
InitFile();
}
储存函数
void SaveJS()
{
dataAll shuju1 = new dataAll();
Info a = new Info();
a.panelTypeString = "qwe";
a.path = "xyz";
shuju1.InfoList.Add(a);
Info b = new Info();
b.panelTypeString = "qwe";
b.path = "xyz";
shuju1.InfoList.Add(b);
string json= JsonUtility.ToJson(shuju1);
//file的初始路径在游戏目录下
//判断是否有json文件,没有就创建
File.WriteAllText(jsonPath, json);
Debug.Log("储存成功");
}
JsonUtility.ToJson():生成对象的公共字段的 JSON 表示形式。
在内部,此方法使用 Unity 序列化器;因此传入的对象必须受序列化器支持:它必须是 MonoBehaviour、ScriptableObject 或应用了 Serializable 属性的普通类/结构。要包含的字段的类型必须受序列化器支持;不受支持的字段以及私有字段、静态字段和应用了 NonSerialized 属性的字段会被忽略.
支持任何普通类或结构,以及派生自 MonoBehaviour 或 ScriptableObject 的类。不支持其他引擎类型。(只能在 Editor 中使用 EditorJsonUtility.ToJson 将其他引擎类型序列化为 JSON)。
请注意,虽然可以将原始类型传递到此方法,但是结果可能不同于预期;此方法不会直接序列化,而是尝试序列化其公共实例字段,从而生成空对象作为结果。同样,将数组传递到此方法不会生成包含每个元素的 JSON 数组,而是生成一个对象,其中包含数组对象本身的公共字段(都无值)。若要序列化数组或原始类型的实际内容,需要将它放入类或结构中。
在start里面调用,就生成了一个存有数据的json文件