今天跟大家来讨论下关于json解析的一些事,
大家都知道unity3D游戏前端一般使用的开发语言都是c#,游戏开发的服务器端的开发语言就比较多了。
据我知道的有c++,JAVA,JavaScript(NodeJS),PHP,Python,Go,等开发语言。
那么这么多语言前端如何与后端进行交互呢?
这就要提到我们今天说的JSON。
JSON全名:JavaScript Object Notation
JavaScript对象标记语言,是一种跨平台,跨语言,轻量级的数据交换格式。
对照关系
通过C#的数据结构,映射到JSON语法描述
命名注意大小写
支持数据类型
数字:short,int,long,float,double
字符串:"abc","你好"
布尔:true,false
数组(链表):string[],List<T>()
对象(字典):new Class,Dictionary<K, V>()
null:null
结构简介
1对象 {"属性名":属性值}
2数组 [值1,值2,值3]
字符含义
{}:大括号表示对象,或是字典
[]:中括号表示数组list<>列表
::冒号表示赋值,等号,左侧为变量(键),右侧为值
,:逗号为元素分割符
“”:双引号为修饰变量,也表示String数据类型
‘’:单引号一般情况下同双引号
JSON与C#代码示例:
JSON(对象)
{"Username" : "root", "Password" : "123"}
c#代码:
public class UserInfo {
public string Username;
public int Password;
}
UserInfo data = new UserInfo();
data.Username = "root";
data.Password = 123
其中username对象对应值“root”
Passward对象对应值123
JSON(数组)
[1, 2, 3]
C#代码
List<int> data = new List<int>();
data.Add(1);
data.Add(2);
data.Add(3);
JSON(复合结构)
[
{"ItemID" : 1, "Name" : "上海车牌", "Price" : 80000},
{"ItemID" : 2, "Name" : "北京车牌", "Price" : 0}
]
C#代码
class Item{
public int ItemID;
public string Name;
public int Price;
public Item(int id, string name, int price) {
ItemID = id;
Name = name;
Price = price;
}
}
List<Item> data = new List<Item>();
data.Add(new Item(1, "上海车牌", 80000));
data.Add(new Item(2, "北京车牌", 0));
-----------------------------------------------------------------
关于JSON与C#的对应关系大致可以分为以上几种关系;
下面我们来说说JSON与C#的解析:
数据的使用
如果想使用JSON中的数据,需要将JSON中的数据转化为当前语言可用的数据类型
如果想将当前语言的数据,传输给别的语言,需要将当前语言的数据类型转化为JSON通用数据类型,再发送或存储
序列化(编程语言数据对象 -> JSON字符串)
反序列化(JSON字符串 -> 编程语言数据对象)
在unity开发中进行JSON数据解析一般有两种方法:
一、
使用unity官方的JSON解析类库
UnityEngine.JsonUtility
重点:经常容易忽略的是在使用UnityEngine.JsonUtility解析复杂JSON文件时特别是有对象数组时一定不要在创建对象数组前加
public class UserInfo {
public string User;
public int Age;
public bool IsE;
public List<ItemInfo> Package;
}
[System.Serializable] //很容易忽略。
public class ItemInfo
{
public int ID;
public string Name;
}
public class UserInfo {
public string User;
public int Age;
public bool IsE;
public List<ItemInfo> Package;
}
[System.Serializable]
public class ItemInfo
{
public int ID;
public string Name;
}
public class TestJsonUtility : MonoBehaviour
{
void Start()
{
TestJsonOverwrite();
}
public void TestUnserialize() {
//JSON字符串
string json = "{\"User\" : \"admin\", \"Age\" : 20, \"IsE\" : false";
//JSON反序列化
UserInfo data = JsonUtility.FromJson<UserInfo>(json);
//获取数据
Debug.Log(data.User);
}
public void TestSerialize() {
//C#数据
UserInfo data = new UserInfo();
data.User = "root";
data.Age = 30;
data.IsE = true;
//将数据序列化为JSON字符串
string json = JsonUtility.ToJson(data);
Debug.Log(json);
}
public void TestFileJsonUnserialize() {
//StreamingAssets目录如何获得
string path = Application.streamingAssetsPath + "/data.json";
//读取文件内容
string json = File.ReadAllText(path);
//将JSON字符串反序列化
UserInfo data = JsonUtility.FromJson<UserInfo>(json);
//获取整个链表
//var package = data.Package;
List<ItemInfo> package = data.Package;
Debug.Log(package[0].Name);
}
public void TestJsonOverwrite() {
string json = File.ReadAllText(Application.streamingAssetsPath + "/data.json");
//实例化UserInfo对象
UserInfo data = new UserInfo();
//使用JSON解析类,将data对象的值进行覆盖
JsonUtility.FromJsonOverwrite(json, data);
//打印出JSON中存储的值
Debug.Log(data.User);
}
}
FromJson:JSON字符串反序列化为C#数据对象
public void TestUnserialize() {
//JSON字符串
string json = "{\"User\" : \"admin\", \"Age\" : 20, \"IsE\" : false";
//JSON反序列化
UserInfo data = JsonUtility.FromJson<UserInfo>(json);
//获取数据
Debug.Log(data.User);
}
Debug出来的数据为:admin
FromJsonOverwrite:JSON字符串反序列化为C#数据对象
public void TestJsonOverwrite() {
string json = File.ReadAllText(Application.streamingAssetsPath + "/data.json");
//实例化UserInfo对象
UserInfo data = new UserInfo();
//使用JSON解析类,将data对象的值进行覆盖
JsonUtility.FromJsonOverwrite(json, data);
//打印出JSON中存储的值
Debug.Log(data.User);
}
获取json文件中的字符串将其反序列化为c#的数据对象。
API:File.ReadAllText(Path)//获取路径为Path的文件内的所有字符串
ToJson:C#数据对象序列化为JSON字符串
public void TestSerialize() {
//C#数据
UserInfo data = new UserInfo();
data.User = "root";
data.Age = 30;
data.IsE = true;
//将数据序列化为JSON字符串
string json = JsonUtility.ToJson(data);
Debug.Log(json);
}
二、使用LitJSON来解析JSON字符串
这是当前市面上大多数使用的方法
首先要去下一个litJSON的类库网上到处都是
然后将它复制到UNITY 工程中
然后要引用命名空间
using LitJson;
JsonMapper.ToObject()
JsonMapper.ToObject<>()
JsonMapper.ToJson()
关于这点我自认怎么写也不会比这位博主讲的更好了大家可以参靠https://blog.csdn.net/zys91011_muse/article/details/76282770