Json文件使用通过JsonUtility读取数据和储存数据

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文件
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44896044/article/details/108054742
今日推荐