首页 > 其他分享 >unity数据持久化-json

unity数据持久化-json

时间:2024-02-02 19:12:55浏览次数:24  
标签:testS 持久 name json unity testI new 序列化 public

JsonUtlity

JsonUtlity是unity自带的序列化和反序列化工具类,主要提供了两个方法ToJsonFromJson

ToJson序列化

比如我们有一个类是这样的

class Person1
{
    public int testI;
    public float testF;
    public double testD;
    public string testS;
    public int[] testArr;
    public List<int> testList;
    public Dictionary<int, string> testDic;
    public Person2 testObj;
    private int testPri = 1;
}

class Person2
{
    public string name;
    public int age;
}

其中包括大部分常用的数据类型,我们可以通过JsonUtlity提供的ToJson Api来实现序列化

Person1 p = new Person1();
p.testI = 18;
p.testF = 1.22f;
p.testD = 1.22;
p.testS = "XXX";
p.testArr = new[] { 1, 2, 3 };
p.testList = new List<int>() { 1, 2, 3 };
p.testDic = new Dictionary<int, string>() { { 1, "test" } };
p.testObj = new Person2() { name = "xxx", age = 18 };
print(JsonUtility.ToJson(p));

//out:
{"testI":18,"testF":1.2200000286102296,"testD":1.22,"testS":"XXX","testArr":[1,2,3],"testList":[1,2,3]}

结果中没有包含

  • 私有的成员
  • dictionary类型
  • 自定义class

在System名称空间中提供了两个特性

[Serializable] //用于标识序列化class
[SerializeField] //用于标识序列化成员

为上述两个类补充上这序列化的特性

[Serializable]
class Person2{
    ...
}

Class Person1{
    ...
    [Serializable]
    private int testPri = 1;
}

再次运行发现除了Dictionary类型之外都能为序列化

FromJson反序列化

通过序列化得到的json字符串

{"testI":18,"testF":1.2200000286102296,"testD":1.22,"testS":"XXX","testArr":[1,2,3],"testList":[1,2,3],"testObj":{"name":"xxx","age":18},"testPri":1}

可以通过

JsonUtility.FromJson<Type>(jsonStr);

来反序列化

image-20240202113910354

{"testI":18,"testF":1.2200000286102296,"testD":1.22,"testS":"XXX","testArr":[1,2,3],"testList":[1,2,3],"testObj":{"name":"xxx","age":18},"testPri":1}

JsonUtlity序列化的不足

无法序列化Dictionary类型

未赋值的成员变量会使用对应的默认值

Person1 p = new Person1();
string jsonStr = JsonUtility.ToJson(p);
print(jsonStr);
//out:
{"testI":0,"testF":0.0,"testD":0.0,"testS":"","testArr":[],"testList":[],"testObj":{"name":"","age":0},"testPri":1}

可以看到,我们在没有对p进行赋值的情况下,它的所有能被序列化的成员都使用了各自的默认值

无法直接读取数据集合

比如我们有一段json格式字符串

[
    {"hp":10,"attack":5},
    {"hp":20,"attack":5},
    {"hp":30,"attack":5}
]

​ 数组的每一个元素为一个对象

class GameObj{
 public int hp;
 public int attack;
}

使用FromJson反序列化的时候会报错

string jsonStr =
            "[\n    {\"hp\":10,\"attack\":5},\n    {\"hp\":20,\"attack\":5},\n    {\"hp\":30,\"attack\":5}\n]";
GameObj[] arr = JsonUtility.FromJson<GameObj[]>(jsonStr);
print(arr);

//ArgumentException: Return type must represent an object type. Received an array.

总结

  • JsonUtlity提供的序列化反序列化方法 ToJson 和 FromJson
  • 自定义类需要加上序列化特性[System.Serializable]
  • 私有保护成员 需要加上[SerializeField]
  • JsonUtlity不支持字典
  • JsonUtlity不能直接将数据反序列化为数据集合

LitJson

LitJson和JsonUtlity一样属于第三方json序列化工具

获取litJson

github: GitHub - LitJSON/litjson: JSON library for the .Net framework

下载之后解压将下面文件夹拖入unity中

image-20240202143129292

使用litjson序列化

api:

JsonMapper.ToJson(obj)

准备一个测试序列化的类

class Test
{
    public int testI;
    public float testF;
    public string testS;
    public List<int> testList;
    public Dictionary<string, string> testDic;
    public Person testP;
    private int testPri = 1;
}

new一个对象并给所有成员变量赋值

Test t = new Test();
t.testI = 1;
t.testF = 1.2f;
t.testS = "hello";
t.testList = new List<int>() { 1, 2, 3, 4 };
t.testDic = new Dictionary<string, string>() { {"1","name"} };
t.testP = new Person();
print(JsonMapper.ToJson(t));

//out:
{"testI":1,"testF":1.2,"testS":"hello","testList":[1,2,3,4],"testDic":{"1":"name"},"testP":{"name":null,"age":0}}

和JsonUtlity不同是的,LitJson不用给Person 类添加特性使其可以被序列化,字典类型可以正常的被序列化,但是私有字段无法被支持

除此之外,如果我们不给 t.testP 赋值

那么序列化出来的结果

t.testP 赋值

//out
{"testI":1,"testF":1.2,"testS":"hello","testList":[1,2,3,4],"testDic":{"1":"name"},"testP":null}

那么testP 的结果便为null,而JsonUtlity则会生成一个多有成员都是默认值的对象

LitJson反序列化

api :

JsonMapper.ToObject<Test>(jsonStr)

使用序列化的json字符串进行反序列化

{"testI":1,"testF":1.2,"testS":"hello","testList":[1,2,3,4],"testDic":{"1":"name"},"testP":{"name":null,"age":0}}

image-20240202145307975

注意

类成员中自定义的class对象需要无参构造函数,否则反序列化会报错

字典只能是string类型作为键

可以直接序列化集合类型

总结

  • LitJson提供的序列化反序列化方法 JsonMapper.ToJson和ToObject<>
  • LitJson无需加特性
  • LitJson不支持私有变量
  • LitJson支持字典序列化反序列化
  • LitJson可以直接将数据反序列化为数据集合
  • LitJson反序列化时 自定义类型需要无参构造

标签:testS,持久,name,json,unity,testI,new,序列化,public
From: https://www.cnblogs.com/blwjw/p/18003692

相关文章

  • Angular 17+ 高级教程 – Angular Configuration (angular.json)
    前言记入一些基本的配置。 SetupIPAddress、SSL、Self-signedCertificate如果你对IPAddress、SSL、Self-signedCertification不熟悉,请看这篇先 VsCode,VisualStudio2022,AngularandLiveServerRunningThroughHttpsandIPAddress在angular.json添加设......
  • 在线JSON转CSV工具
    高效便捷,一键转换——在线JSON转CSV工具引领数据处理新潮流在大数据时代,数据处理与交换已经成为日常工作生活中的常态。而JSON和CSV作为两种广泛应用的数据格式,它们在不同场景下发挥着关键作用。然而,在实际操作中,我们时常需要在这两种格式之间进行转换。为此,一款强大且易用的在线JS......
  • 依赖注入之IConfiguration 访问appSetting.json
    (1)创建NET6Webapi(2)appsettings.json{"Logging":{"LogLevel":{"Default":"Information","Microsoft.AspNetCore":"Warning"}},"AllowedHosts":"*&q......
  • Python3 JSON
    PythonJSON转换 python3的json.loads不支持encoding#python3.11JSON序列化、反序列化importjsondefdata=’{\"Message":"消息", \"Timestamp":"时间戳" \}' #字符串转换编码集为UTF-8json_str=data.encode('ut......
  • 比较以下Unity AStar Pathfinding, NavMesh, Recast Navigation 寻路算法的优点与缺点
    一、AStarPathfindingAStarPathfinding是一种基于图搜索的寻路算法,它使用启发式搜索来找到最短路径。AStarPathfinding的优点包括:高效性:AStarPathfinding是一种高效的寻路算法,因为它使用启发式搜索来找到最短路径,可以大大减少搜索空间,从而提高寻路速度。灵活性:AStarPathf......
  • 解决Unity中PackageManager无法下载插件的问题
    参考解决方法:1.断网打开unity,Packagemanager能够显示需下载的插件,然后再联网下载(但是可能下载失败,笔者就是这种情况)2.修改工程文件Packages的maifest.json,在里面直接导入你要下载的插件,前提你已经下载过了我这里是导入cinmemachine,在unity就显示导入成功......
  • 第17天:信息打点-语言框架&开发组件&FastJson&Shiro&Log4j&SpringBoot等
    框架:简单代码的一个整合库,如果使用框架就只需要学习使用框架调用即可如:文件上传功能是需要很多代码来实现的,框架把这个代码进行封封装,调用即可影响:如果采用框架开发,代码的安全性是取决于框架的过滤机制 #Python-开发框架-Django&FlaskDjango1、识别插件2、Set-Cookie:expi......
  • ASP.NET Core中JsonResult和ObjectResult的用法
    ​  在ASP.NETCore中,JsonResult和ObjectResult是两种用于返回数据的ActionResult类型,它们在控制器中用来生成HTTP响应。选择使用JsonResult还是ObjectResult取决于具体需求。如只需要返回JSON格式的数据,JsonResult是一个简单且直接的选择。如果API需要支持多种响应格式,则Obje......
  • Windows平台下Unity-ROS环境搭建
    最近在做AI+机器人的课程项目,因为平常用Unity比较多,所以就想着把Unity和ROS结合起来使用。上Github上面一查发现官方是有做适配的。虽然已经有一段时间没有更新了,但也还能用。搭建的步骤和在搭建过程中遇到的一些问题,在这里记录一下。ROS-Unity介绍ROS-Unity就是在原本独立的ROS......
  • Python | json文件和jsonl文件
    Python|json文件和jsonl文件JSON文件是使用JSON(JavaScriptObjectNotation)格式存储数据的文件。它是一种结构化的文本格式,使用键值对的方式表示数据。JSON文件通常包含一个根对象,可以包含多个嵌套的对象、数组和基本数据类型。而JSONL文件(JSONLines),则是一种每行包含一......