Unity中将对象存储为json,并永久存储到磁盘中

2023-09-06  本文已影响0人  全新的饭

提供方法

// 读取对象
Fan.JsonUtilities.JsonHelper.ReadFromJson<RoleData>(存储文件名称); 
// 读取对象数组
Fan.JsonUtilities.JsonHelper.ReadListFromJson<RoleData>(存储文件名称);
// 存储对象
Fan.JsonUtilities.JsonHelper.SaveAsJson(对象,存储文件名称);
// 存储对象数组
Fan.JsonUtilities.JsonHelper.SaveAsJson(对象数组,存储文件名称);
// 删除存储对象
Fan.JsonUtilities.JsonHelper.Delete(存储文件名称);

注意

要保存的字段的访问修饰符必须是public。
如果要存储对象数组,则该对象对应的类必须用[System.Serializable]标记。

代码

JsonHelper.cs

using System.ComponentModel;
using System.Linq;
using System.IO;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Fan.JsonUtilities
{
    public static class JsonHelper
    {
        #region 读取、保存、删除
        public static List<T> ReadListFromJson<T>(string fileName)
        {
            string content = FileNameToContent(fileName);
            var result = new List<T>();
            if (IsValidContent(content))
            {
                result = ArrayJsonExtension.FromJson<T>(content).ToList();
            }
            return result;
        }

        public static T ReadFromJson<T>(string fileName)
        {
            string content = FileNameToContent(fileName);
            T result = default;
            if (IsValidContent(content))
            {
                result = JsonExtension.FromJson<T>(content);
            }
            return result;
        }
        public static bool SaveAsJson<T>(List<T> objs, string fileName)
        {
            return SaveAsJson(ArrayJsonExtension.ToJson<T>(objs.ToArray()), fileName);
        }

        public static bool SaveAsJson<T>(T obj, string fileName)
        {
            return SaveAsJson(JsonExtension.ToJson<T>(obj), fileName);
        }
        public static bool Delete(string fileName)
        {
            WriteFile(GetPath(fileName), string.Empty);
            return true;
        }
        #endregion

        private static string GetPath(string fileName)
        {
            return Application.persistentDataPath + "/" + fileName + ".json";
        }

        private static void WriteFile(string path, string content)
        {
            FileStream fileStream = new FileStream(path, FileMode.Create);
            using (StreamWriter writer = new StreamWriter(fileStream))
            {
                writer.Write(content);
            }
        }

        private static string ReadFile(string path)
        {
            if (File.Exists(path))
            {
                using (StreamReader reader = new StreamReader(path))
                {
                    string content = reader.ReadToEnd();
                    return content;
                }
            }
            return string.Empty;
        }

        private static string FileNameToContent(string fileName)
        {
            return ReadFile(GetPath(fileName));
        }

        private static bool IsValidContent(string content)
        {
            return !string.IsNullOrEmpty(content) && content != "{}";
        }

        private static bool SaveAsJson(string content, string fileName)
        {
            WriteFile(GetPath(fileName), content);
            return true;
        }

        private static class ArrayJsonExtension
        {
            public static T[] FromJson<T>(string json)
            {
                Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
                return wrapper.objs;
            }
            public static string ToJson<T>(T[] array, bool prettyPrint = true)
            {
                Wrapper<T> wrapper = new Wrapper<T>();
                wrapper.objs = array;
                return JsonUtility.ToJson(wrapper, prettyPrint);
            }

            [Serializable]
            private class Wrapper<T>
            {
                public T[] objs;
            }
        }
        private static class JsonExtension
        {
            public static T FromJson<T>(string json)
            {
                T obj = JsonUtility.FromJson<T>(json);
                return obj;
            }
            public static string ToJson<T>(T obj, bool prettyPrint = true)
            {
                return JsonUtility.ToJson(obj, prettyPrint);
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读