一、介绍
- Json是最常用也是目前用的比较多的一种,超轻量级,可便捷性使用,平时用到比较多的都是解析Json和往Json中添加数据、修改数据等等
- JSON(JavaScript Object Notation,JS对象标记)是一种轻量级的数据交换格式,它基于ECMAScript(w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率
- 在Unity中大致有三种使用Json的方式
- 分别是使用类库的两种:System.Json(便于JSON生成)和LitJson(便于JSON解析)
- 还有一种是UnityEngine.Jsonutility
- 其中前两种都需要将System.Json.dll或 LitJson.dll两个dll文件放到Unity的plugins文件夹中才能使用相应的命名空间和方法
- UnityEngine.JsonUtility则可以直接使用其中的方法
二、语法规则
- 数据都放置到一个大括号里
- 一对对的数据放到大括号里
- 一个个的数据放到中括号里
- 一个大括号或一个中括号都可以表示一个值
- 数据与数据之间用逗号分隔
- Key必须要用引号引起来
- Value如果是字符串要用引号引起来
- 最后一个数据后面不要加逗号
- 数据保存在键值对中
JSON语法示例:
{"students":[{"name":"albert","age":19,"sex":"M"},{"name":"mary","age":11,"sex":"W"}]
}
解析成实体类后:
public class StudentsItem
{public string name { get; set; }public int age { get; set; }public string sex { get; set; }
}public class Root
{public List <StudentsItem > students { get; set; }
}
由于Json对字符串的格式非常严格,输入一个字符错误都不行,所以我们可以使用相关的Json转换网站进行格式转换
https://www.json.cn/json2csharp.html 这个网站就可以实现JSON数据转实体的功能
三、System.Json
先来说一下System.Json的基本用法
System.Json是一种类库,当我们在Unity中导入System.Json.dll文件后就可以使用System.Json.dll json命名空间
可以用到的类:JsonArray、JsonObject、JsonPrimitive、JsorValue。枚举:JsonType
具体操作,在Unity中新建一个Plugins文件夹,然后将dll文件放入即可
四、示例
using System.Json;
using UnityEngine;public class JsonTest : MonoBehaviour
{void Start(){//创建⼀个JSON对象,相当于⼀个⼤括号JsonObject jsonTransform = new JsonObject();//创建⼀个JSON值对象,存储⼀个ValueJsonValue jsonPosition = "10,20,30";//JSON对象,也就是⼤括号,添加⼀个key:valuejsonTransform.Add("position", jsonPosition);//打印结果Debug.Log(jsonTransform.ToString());//定义⼀个值数组,⽤来存储,中括号中的⼀个个的值JsonValue[] rotationXYZ = new JsonValue[] { 20, 30, 40 };//将这个数组中的⼀个个的值放到JsonArray数组对象中JsonArray jsonRotation = new JsonArray(rotationXYZ);//⼀个JsonArray对象,也可以是⼀个Value,//所以可以⽤jsonTransform来AddjsonTransform.Add("rotation", jsonRotation);//打印结果Debug.Log(jsonTransform);JsonObject x = new JsonObject();x.Add("x", 10);JsonObject y = new JsonObject();y.Add("y", 20);JsonObject z = new JsonObject();z.Add("z", 30);//实例⼀个jsonValues数组(所有类型都可以转换成jsonValue)JsonValue[] scaleXYZ = new JsonValue[] { x, y, z };//将实例好了的数组,添加到jsonArray对象中,形成⼀个jsonArray对象//作⽤在于给这个整体,添加⼀个中括号[]JsonArray jsonScale = new JsonArray(scaleXYZ);//将这个整体,放⼊到jsonTransform中jsonTransform.Add("scale", jsonScale);//打印结果Debug.Log(jsonTransform);}
}
打印结果:
五、LitJson
常用API方法如下:
- 把对象转化成JSON格式字符串:JsonMapper.ToJson
- 把JSON格式字符串转化成对象:JsonMapper.ToObject
- 把JSON格式字符串转化成指定类的对象:JsonMapper.ToObject
1.生成
我们写一个字段类Person,类里面有string类型的"Name"和int型的"Age"
using System.IO;
using UnityEngine;[System.Serializable]
class Person
{public string Name;public int Age;
}
[System.Serializable]
class Data
{public Person[] Person;
}
public class NewBehaviourScript : MonoBehaviour
{void Start(){WriteData();}//写数据public void WriteData(){//新建一个数据类Data m_Data = new Data();//新建一个字段类 进行赋值m_Data.Person = new Person[3];for (int i = 0; i < 3; i++){Person m_Person = new Person();m_Person.Name = "User" + i;m_Person.Age = 20 + i;m_Data.Person[i] = m_Person;}//将数据转成jsonstring js = JsonUtility.ToJson(m_Data);//获取到项目路径string fileUrl = Application.dataPath + "\\jsonInfo.txt";//打开或者新建文档using (StreamWriter sw = new StreamWriter(fileUrl)){//保存数据sw.WriteLine(js);//关闭文档sw.Close();sw.Dispose();}}
}
2.解析
先读取Json文件,使用IO命名空间下的File类的OpenText()函数进行读取
然后使用JsonUtility.FromJson进行解析
using System.IO;
using UnityEngine;[System.Serializable]
class Person
{public string Name;public int Age;
}
[System.Serializable]
class Data
{public Person[] Person;
}
public class NewBehaviourScript : MonoBehaviour
{void Start(){string jsonData = ReadData();Data m_PersonData = JsonUtility.FromJson<Data>(jsonData);foreach (Person item in m_PersonData.Person){Debug.Log(item.Name);Debug.Log(item.Age);}}//读取文件public string ReadData(){//string类型的数据常量string readData;//获取到路径string fileUrl = Application.dataPath + "\\jsonInfo.json";//读取文件using (StreamReader sr = File.OpenText(fileUrl)){//数据保存readData = sr.ReadToEnd();sr.Close();}//返回数据return readData;}
}