JSON数据格式
JSON相当于是语言的数据媒介,简称JavaScript Objiect Notation。JavaScript是一种跨平台、跨语言、轻量级的数据交换和存储格式。
服务器:存储和处理数据的一台或一组电脑
在网页上按下F12可以出现调试工具
服务器语言:Java、C++、JS、PHP、Python、Go
unity开发语言:C#、Lua
JSON校验格式工具:https://www.bejson.com/
声明对象:{}就已经是声明了
JSON可以直接写在JavaScript文件中,是Javascript中的一部分,纯文本也可以。
支持的数据类型
数据类型 | 包含 |
---|---|
数字型 | short、int、float、long、double |
字符串 | “abc”、‘abc’ |
布尔值 | true、false |
数组(列表) | [值1,值2] |
对象(字典) | {“键1”:“值1”,“键2”:“值2”} |
数组和对象中可以是不同的类型,对象和数组也可以互套,JSON中的对象与C#中的对象还是有区别,可以不用一一对应相同的类型。
每次的使用需要清除之前的,不然会报错。对应C#中字典的写法:new Dictionary<string,int>{{"a":1},{"b":2}}
字符含义 | |
---|---|
[ ] | 数组、列表 |
{} | 对象、字典 |
: | 赋值,左边是键名称或变量,右边是值 |
, | 元素分隔符,最后一个没有 |
" " 和 ’ ’ | 修饰变量,表示string数据类型 |
在游戏中使用JSON
存储在服务器中的数据
存储策划配置中的Excel(Excel->JSON)
Excel->JSON步骤
1、记录Excel数据
2、将Excel导出为CSV
在bejson网站中有Excel->JSON
C#使用JSON数据
数据存储(序列化):C#数据格式->JSON字符串,存储或传输;
数据使用(反序列化):JSON字符串中存储的数据->C#可使用的数据格式;
序列化:(程序数据->JSON字符串)
反序列化:(JSON字符串->程序数据)
Unity中的JSON工具
在类的前面加上[System.Serializable]
,表示该数据可以被序列化后存储,不加在UnityJson工具中会有问题,在其它类中作为成员变量无法使用
将C#对象数据转换为JSON字符串(序列化)JsonUtility.ToJson(data);
[System.Serializable]
public class SubData//该对象为空
{
}
[System.Serializable]//类产生的对象数据,可以被序列化后存储
internal class Data
{
public int ID;
public string Name;
public bool IsStudent;
public SubData Sub;//对象型
public List<int> Numbers;//列表
}
//使用unity的内置JSON解析工具,将C#数据序列化为JSON字符数据
public class JSONEncode : MonoBehaviour
{
public void Start()
{
Data data = new Data();
data.ID = 2;
data.Name = "呵呵";
data.IsStudent = false;
data.Sub = null;
data.Numbers = new List<int> { 1, 2, 3 };
//将c#对象数据,转换为JSON字符串
string j = JsonUtility.ToJson(data);
Debug.Log(j);
}
}
打印结果
存游戏物体是就是存字符串路径,加载路径
反序列化JsonUtility.FromJson<Data>(json);
创建一个json文件,把上面序列化的内容复制到文件中,选择utf-8编码。
public class JsonDeCode : MonoBehaviour
{
void Start()
{
//以".json"扩展名文件可以作为TextAssert数据加载
TextAsset asset = Resources.Load<TextAsset>("JSON/test");
//获取TextAssert中的内容
string json = asset.text;
Debug.Log(json);
//反序列化
Data d = JsonUtility.FromJson<Data>(json);
Debug.Log(d.Name);
Debug.Log(d.ID);
Debug.Log(d.IsStudent);
Debug.Log(d.Numbers);
Debug.Log(d.GO);
}
}
如果打印出来的与json文件中的一致,反序列化成功。
目录结构如下:
如果使用的unity的内置解析类,最外层结构必须是对象,不能数组,如果最外层是数组,那么可以在最外层套一个对象
创建一个C#文件解析道具
[System.Serializable]
public class ItemTable
{
public List<Item> Data;
}
[System.Serializable]
public class Item
{
public int ID;
public string Name;
public string Description;
public int Level;
public int PriceType;
}
public class JsonItem : MonoBehaviour
{
private void Start()
{
TextAsset a = Resources.Load<TextAsset>("JSON/Item");
string json = a.text;
ItemTable js = JsonUtility.FromJson<ItemTable>(json);
Debug.Log(js.Data[0].Name);
}
}
会打印出json文件中第一个道具的名称。