Unity学习笔记--数据持久化Json
JSON相关
json是国际通用语言,可以跨平台(游戏,软件,网页,不同OS)使用,
json语法较为简单,使用更广泛。json使用键值对来存储。

认识json文件
//注意字典类型存储时,键是以string类型存储的 需要添加“”
{
"name": "TonyChang",
"age":21,
"sex":true,
"Float": 2.5,
"arrarys":[1,5,9],
"friends": [{"name": "Tom","age":21, "sex":true,"Float": 2.8},
{"name": "Peter","age":17, "sex":true,"Float": 3.5},
{"name": "Jack","age":25, "sex":true,"Float": 5.0}
],
"university": {"address": "唐山","province":"河北"},
"dic": {"1":"125","2": 911},
"son": null
}
Excel转换为JSON文件:
使用网站来转换:bejson
挖坑-----》开发一个工具,使各种类型存储文件进行转换。
Json的读写:
jsonUtlity中的使用:
string jisonStr = JsonUtility.ToJson(_writer);
File.WriteAllText(Application.persistentDataPath+"/DemoJson1.json",jisonStr);
转储为JSON时要点:
- float存储时看起来会有一些误差
- 自定义类序列化要添加序列化特性[System.Serializable]
- 想要序列化私有变量,需要添加序列化特性[SerializeField]
- JsonUtility不支持字典
- JsonUtility存储对象时候不会为null是默认值的数值
完整的类
using System;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
namespace Building.JSON
{
public class Writer
{
public string name;
public int age;
public bool sex;
[SerializeField]
protected float numberF = 3.15f;
[SerializeField]
private double numberD = 6.15;
public List<int> Array;
public IDCard idcard;
}
[Serializable]
public class IDCard
{
public int stu_id;
public int cl_id;
}
public class JsonPractice:MonoBehaviour
{
private Writer _writer;
private void Awake()
{
_writer = new Writer();
_writer.name = "TonyCode";
_writer.sex = true;
_writer.age = 21;
_writer.Array = new List<int>() {1, 2, 3, 4, 5};
_writer.idcard = new IDCard();
_writer.idcard.cl_id = 256;
_writer.idcard.cl_id = 206;
string jisonStr = JsonUtility.ToJson(_writer);
File.WriteAllText(Application.persistentDataPath+"/DemoJson1.json",jisonStr);
print(Application.persistentDataPath);
}
}
}

存储生成的json文件内容。
反序列化:
string jsonStrRead = File.ReadAllText(Application.persistentDataPath + "/DemoJson1.json");
//反序列化
Writer writer01 = JsonUtility.FromJson<Writer>(jsonStrRead);
Writer writer02=JsonUtility.FromJson(jsonStrRead,typeof(Writer)) as Writer;
注意:使用JsonUtility.FromJson进行反序列化时候接受对象是一个对象,不能是一个数据集合来接受Json中存储的数据内容。并且json的编码格式必须为UTF-8。
JSON文件的写入与读取,本质是对text文本的读写,所以会调用File类中对text文本相关的方法。
先将类转换为string字符串(Json文件格式的字符串),然后调用文件方法进行读写。
2.LitJson(第三方开发的工具包)
//使用LitJson存储
string jsonStr2=JsonMapper.ToJson(_writer);
File.WriteAllText(Application.persistentDataPath+"/DemoJson2.json",jsonStr);
注意:(区别JsonUtility)
- 不能序列化private变量;
- 对于自定义类不需要添加序列化特性就可以进行序列化;
- 支持字典类型,建议字典类型的键的类型为“string”;
- 可以准确保存null类型;
//使用LitJson读(反序列化)
string jsonStrRead3 = File.ReadAllText(Application.persistentDataPath + "/DemoJson2.json");
//方法一
JsonData data = JsonMapper.ToObject(jsonStrRead3);
print(data["name"]);
//方法二 (使用较多)
Writer writer03= JsonMapper.ToObject<Writer>(jsonStrRead3);
读取数据集合:
//数据集合中元素类型
public class RoleInfo
{
public int hp;
public int speed;
public int volume;
public string resName;
public int scale;
}
//读取数据集合
string jsonStrRoleList = File.ReadAllText(Application.persistentDataPath + "/RoleInfo.json");
List<RoleInfo> roleInfos = JsonMapper.ToObject<List<RoleInfo>>(jsonStrRoleList);
foreach (var roleInfo in roleInfos )
{
print(roleInfo.hp+" "+roleInfo.speed+" "+roleInfo.resName);
}
RoleInfo.json内容
[
{"hp":4,"speed":6,"volume":5,"resName":"Airplane/Airplane1","scale":15},
{"hp":3,"speed":7,"volume":4,"resName":"Airplane/Airplane2","scale":15},
{"hp":2,"speed":8,"volume":3,"resName":"Airplane/Airplane3","scale":15},
{"hp":10,"speed":3,"volume":10,"resName":"Airplane/Airplane4","scale":6},
{"hp":6,"speed":5,"volume":7,"resName":"Airplane/Airplane5","scale":10}
]
读取字典:
//读取字典
//注意字典元素内容最后一个不应当添加逗号
string jsonStrDic = File.ReadAllText(Application.persistentDataPath + "/JsonDic.json");
Dictionary<string, int> games = JsonMapper.ToObject<Dictionary<string, int>>(jsonStrDic);
foreach (KeyValuePair<string,int> kv in games)
{
print(kv.Key+" "+kv.Value);
}
JsonDic.json中内容:
{
"Tony": 100,
"Jack": 125,
"Pony": 156,
"Tom": 126
}
注意:
- litJson支持字典存储,字典键的类型为string
- 自定义类结构一定要有无参构造函数
- LitJson可以直接读取数据集合
- LitJson读取字典元素时候 字典内容最后一个不可以加逗号(可能反序列化失败)
对比JsonUtility和JsonLit二者使用:
相同:
- 二者都是对json文件进行序列化与反序列化的工具类
- 二者都是静态调用,使用其中的方法
- json的格式必须为UTF-8格式
区别:LitJson对比JsonUtility
- 对于空对象,LitJson对可以存储null类型,而后者只存储对应的默认数据数据值
- LItJson支持数据集合的读取,而后者需要将其转换为对象内部的数组才可以读取,读取存储结果为对象类型,而非数据集类型。
- LitJson支持对字典的存取,字典的键的类型为string
- LitJson存储兹定于数据类型时候无需添加序列化特性,而后者需要
- LitJson不支持对priivate数据内容的序列化,后者使用时候添加序列化特性则可以完成存储
- LitJson要求自定义数据类型必须有无参构造,而JsonUtility则不需要
Json读存的工具类:
using System.IO;
using LitJson;
using UnityEngine;
namespace Building.JSON
{
public enum SaveJsonType
{
JsonUtility,
LitJson
}
public class JsonManager
{
private static JsonManager instance=new JsonManager();
public static JsonManager Instance => instance;
private JsonManager()
{
}
/// <summary>
/// 存储Json方法
/// </summary>
/// <param name="data">要存储的数据类</param>
/// <param name="FileName">存储文件名称</param>
/// <param name="type">存储方法</param>
public void SaveJson(object data, string FileName,SaveJsonType type=SaveJsonType.LitJson)
{
//确定路径
string path = Application.persistentDataPath + "/"+FileName+ ".json";
string jsonStr="";
switch (type)
{
case SaveJsonType.LitJson:
jsonStr = JsonMapper.ToJson(data);
break;
case SaveJsonType.JsonUtility:
jsonStr = JsonUtility.ToJson(data);
break;
}
//写入文件
File.WriteAllText(path,jsonStr);
}
/// <summary>
/// 读取json方法
/// </summary>
/// <param name="FileName">读取json的名称</param>
/// <param name="type">读取方式</param>
/// <typeparam name="T">读取json文件中数据类型</typeparam>
/// <returns></returns>
public T LoadJson<T>(string FileName, SaveJsonType type = SaveJsonType.LitJson) where T : new()
{
//确定路径
string path = Application.persistentDataPath + "/"+FileName+ ".json";
if (!File.Exists(path))
{
path=Application.streamingAssetsPath+"/"+FileName+".json";
if (!File.Exists(path))
{
return new T();
}
}
string jsonStrRead=File.ReadAllText(path);
T data = default(T);
switch (type)
{
case SaveJsonType.LitJson:
data=JsonMapper.ToObject<T>(jsonStrRead);
break;
case SaveJsonType.JsonUtility:
data= JsonUtility.FromJson<T>(jsonStrRead);
break;
}
return data;
}
}
}
Unity学习笔记--数据持久化Json的更多相关文章
- tensorflow学习笔记——模型持久化的原理,将CKPT转为pb文件,使用pb模型预测
由题目就可以看出,本节内容分为三部分,第一部分就是如何将训练好的模型持久化,并学习模型持久化的原理,第二部分就是如何将CKPT转化为pb文件,第三部分就是如何使用pb模型进行预测. 一,模型持久化 为 ...
- Adaptive AUTOSAR 学习笔记 15 - 持久化 Persistency
本系列学习笔记基于 AUTOSAR Adaptive Platform 官方文档 R20-11 版本 AUTOSAR_EXP_PlatformDesign.pdf.作者:Zijian/TENG 原文地 ...
- Android学习笔记之Fast Json的使用
PS:最近这两天发现了Fast Json 感觉实在是强大.. 学习内容: 1.什么是Fast Json 2.如何使用Fast Json 3.Fast Json的相关原理 4.Fast Json的优势, ...
- [学习笔记]可持久化数据结构——数组、并查集、平衡树、Trie树
可持久化:支持查询历史版本和在历史版本上修改 可持久化数组 主席树做即可. [模板]可持久化数组(可持久化线段树/平衡树) 可持久化并查集 可持久化并查集 主席树做即可. 要按秩合并.(路径压缩每次建 ...
- PHP 开发 APP 接口 学习笔记与总结 - JSON 方式封装通信接口
1.通信数据的标准格式 ( JSON ),包括: code:状态码(200,400等) message:提示信息(例如:数据返回成功.邮箱格式错误等) data:返回数据 2.JSON 方式封装通信接 ...
- iOS学习之数据持久化详解
前言 持久存储是一种非易失性存储,在重启设备时也不会丢失数据.Cocoa框架提供了几种数据持久化机制: 1)属性列表: 2)对象归档: 3)iOS的嵌入式关系数据库SQLite3: 4)Core Da ...
- Android学习_数据持久化
数据持久化:将内存中的瞬时数据存储到设备中 1. 文件存储 存储一些简单的文本数据或二进制数据. 核心:Context类提供的openFileOutput()和openFileInput()方法,然后 ...
- Docker 学习笔记(持久化数据的备份,还原)
假如我们应用程序需要一台 mssql 数据库来持久化数据,我们将 mssql 数据库运行于 Docker 容器中: docker run -d -p 1433:1433 -e "ACCEPT ...
- 吴裕雄--天生自然python学习笔记:Python3 JSON 数据解析
JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. Python3 中可以使用 json 模块来对 JSON 数据进 ...
- Android学习笔记_14_对JSON格式数据的处理
public class ParseJsonTest extends AndroidTestCase{ public void testJson() throws Exception { String ...
随机推荐
- [转帖]Jmeter_jmeter-plugins插件的安装使用
一.安装JMter Plugins 1.官网下载 JMeter Plugins 的jar包 2. 将下载的jar包复制到 %JMETER_HOME%\lib\ext 目录下 3. 启动 JMeter ...
- JVM内存初步学习
JVM内存初步学习 最近在学习容器内的JVM运行, 简单总结了下学习结果, 但是感觉还是分不清楚很多地方: 同事帮忙进行了 native memory的监控, 主要信息简要如下: jvm刚运行起来 ...
- 京东云RASP云原生安全免疫创新实践
作者:京东云 刘一鑫 1 背景 随着网络攻击事件整体呈上升趋势,应用作为网络入口承载着大量业务和流量,因此成为了安全的重灾区.黑客往往借助自动化的工具以及安全漏洞,对Web进行漏洞扫描和探测,进而利用 ...
- 从零开始配置 vim(5)——本地设置与全局设置
在前面的一系列文章中,我们介绍了使用 :noremap 进行键盘映射,使用 set 来设置选项和 vim 的变量.并且已经在配置文件中对他们进行了相关配置. 在介绍设置那一篇文章中我们提到了,lua ...
- 【一】AI Studio 项目详解【(一)VisualDL工具、环境使用说明、脚本任务、图形化任务、在线部署及预测】PARL
相关文章 [一]-环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简介 [五]-Sarsa&Qlear ...
- 『深度学习项目四』基于ResNet101人脸特征点检测
相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...
- C++ Qt开发:TableWidget表格组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWi ...
- 3.4 DLL注入:全局消息钩子注入
SetWindowHookEx 是Windows系统的一个函数,可用于让一个应用程序安装全局钩子,但读者需要格外注意该方法安装的钩子会由操作系统注入到所有可执行进程内,虽然该注入方式可以用于绕过游戏保 ...
- 从嘉手札<2024-1-2>
最近看了很多这样的文案,某音有,某扑也有很多,出于infp的被动,莫名的觉得悲伤. 悲伤的是一颗真心没有得到珍惜, 而更令我觉得悲伤的是, 人们往往会把自己炽烈如山海一样的情感倾泻给自己心仪的对象, ...
- SpringCloud-01-Eureka Ribbon
1.微服务技术 2.SpringCloud SpringCloud是目前国内使用最广泛的微服务框架.官网地址:https://spring.io/projects/spring-cloud. Spri ...