Json方案
简介
JSON: JavaScript Object Notation(JavaScript 对象表示法)
JSON是存储和交换文本信息的语法,类似 XML。JSON比 XML 更小、更快,更易解析。
JSON易于人阅读和编写。C、Python、C++、Java、PHP、Go 等编程语言都支持 JSON。
方法
文件读写
在unity进行json文件读写操作需要引入命名空间System.IO中的File类。使用其中相关静态函数。
1
2
3
4
5
|
using System.IO;
//写入
File.WriteAllText(string path, string text, json);
//读取
string json = File.ReadAllText(string path);
|
存储位置
Application.persistentDataPath
适用于保存需要长期保留的用户数据(如设置、进度、关卡数据等)。
在各平台上的实际路径不同,但都在应用可写的目录。
转为json字符串
将数据转换为Json字符串使用unity提供的类JsonUtility中的静态函数。
1
2
3
4
|
//转换为json。
string json = JsonUtility.ToJson(object obj, bool prettyPrint = false);
//转换为对象。
Data data = JsonUtility.FromJson<Data>(string json);
|
示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
using System.IO;
public static class JsonHelper
{
public static void SaveJson(string path, object obj)
{
string finalPath = Application.persistentDataPath + "/" + path;
//或者string finalPath = Path.Combine(Application.persistentDataPath, path);
string jsonData = JsonUtility.ToJson(obj, true);
//可以在write这里进行适当的错误处理
File.WriteAllText(finalPath, jsonData, json);
}
public static T LoadJson<T>(string path)
{
string finalPath = Application.persistentDataPath + "/" + path;
if(File.Exists(finalPath))
{
string jsonData = File.ReadAllText(path);
//担心转换的对象有问题可以在这里进行适当的错误处理。
return JsonUtility.FromJson<T>(jsonData);
}
}
}
|
注意
限制
JsonUtility.ToJson支持任何普通类和结构体,和派生自MonoBehaviour或scriptableOnject的类。且只支持其中unity受序列化器支持的字段。虽然可以将C#原始类型传入,但是只会在Json中生成空对象字段。
虽然ToJson方法支持派生自MonoBehaviour或scriptableOnject的类,但是JsonUtility.FromJson只支持创建普通类和结构;不支持派生自UnityEngine.Object的类(如MonoBehaviour或ScriptableObject)。
如果想从Json读取并创建或者覆写怕派生自UnityEngine.Object的类,可以额外创建一个只包含数据的普通类,再提供这个数据类进行对象的创建或者覆写。
或者想对更多数据类型的支持,如字典,列表等,可以使用其他的api如Newtonsoft.Json(Json.NET)— 适合更复杂的结构。
优点:支持字典、列表、嵌套对象等,序列化选项灵活。