Newtonsoft.Json
介绍
-
Newtonsoft.Json 另一个名称是 json.net
-
官网 https://www.newtonsoft.com/json
-
github https://github.com/JamesNK/Newtonsoft.Json
-
文档 https://www.newtonsoft.com/json/help/
-
示例 https://www.newtonsoft.com/json/help/html/Samples.htm
-
由于很多库都会用到 Newtonsoft.Json,而 unity 中不能有同名程序集,因此 unity 集成了自己的 Newtonsoft.Json 插件,
可在 PackageManager 中查找 collab-proxy 安装,命名空间从 Newtonsoft.Json 改成 Unity.Plastic.Newtonsoft.Json
建议你写的代码都使用这个插件,对于多个第3方都使用 Newtonsoft.Json,只能保留1个,强制删除多余的
安装
- 直接通过 unity 的 PackageManager 安装 collab-proxy
- 通过官网下载,里面包含源码和编译好的程序集
- 通过 github 克隆源码后自己编译
通过类似DOM序列化JSON
-
类层次介绍
- JToken 对象基类,可以放在 : 右边的,都是 JToken,包含类型和值
- JProperty 表示一组 name:jtoken,有一个字符串的 Name 和 一个 JToken 的Value
- JValue : JToken 原生值类型,比如 int,string 都会创建 JValue 来存放,原生值类型跟JToken可以隐式转换,会自动创建 JValue
如果是原生类型,,则可以跟 JToken 直接互转,比如 int a = (int)jtoken; JToken jtoken=(JToken)a;
如果是派生类型,一样可以互转包含原生类型,以及 JObject , JArray 等派生类型 - JObject:JToken 表示 {},包含一组 JProperty
- JArray:JToken 表示 [],包含一组 JToken
-
示例代码
public class Example { public static string JSON_OBJECT_STR = "{\"ID\":11,\"Name\":\"张三1\",\"Birthday\":\"2020-11-02T00:00:00\",\"IsVIP\":true}"; // \" 表示 " public static string JSON_ARRAY_STR = @"[{""ID\"":11,""Name"":""张三1""},{ ""ID"":12,""Name"":""李四""}]"; // 用 @ 转义,则用 "" 表示 " public static void RemoveProperty(JObject obj) { if ( obj.Remove("ID") ) { } } // 创建对象 public static JObject CreateObject() { JObject obj = new JObject(); obj.Add("ID", 11); obj.Add("Name", "张三1"); obj.Add("Birthday", DateTime.Parse("2020-11-02")); obj.Add("IsVIP", true); obj.Add("Account", 13.34f); obj.Add("Remark", null); obj.Add(new JProperty("ID", 11)); } // 用初始化器填充对象 public static JObject CreateObject2() { return new JObject() { { "name", "jack" }, { "age", 28 } }; } public static JObject CreateObject3() { return new JObject( new JProperty("title", "James Newton-King"), new JProperty("price", 3.3), new JProperty("channel", new JObject( new JProperty("item", new JArray( from p in posts orderby p.Title select new JObject( new JProperty("title", p.Title), new JProperty("description", p.Description), ) )) )) ); } public static JObject ParseObject1() { return JObject.Parse(JSON_OBJECT_STR); } public static JObject ParseObject2() { // 实体类直接转成 JObject Person person = new Person(); return JObject.FromObject(person); } // 复用匿名对象快速创建 JObject public static JObject CreateObject5() { // 匿名实体类 return JObject.FromObject(new { name = "jack", age = 28, data = new { title="1"} }); } public static JArray CreateArray() { JArray array = new JArray(); array.Add(new JValue("上班")); array.Add(new JValue("下班")); return array; } public static JArray CreateArray2() { return new JArray("上班", "下班"); } public static JArray CreateArray3() { return JArray.Parse(JSON_ARRAY_STR); } public static JArray CreateArray4() { Person[] person = new Person[2]; return JArray.FromObject(person); } public static void WriteJsonFile() { JObject o = CreateObject(); // 直接写入文件 using (StreamWriter writer = File.CreateText("c:\\1.json")) { o.WriteTo(new JsonTextWriter(writer)); } // 转成字符串再写入文件 string s = o.ToString(); File.WriteAllText("c:\\1.json", s); } // 解析 JToken public static void ParseToken(JToken token) { if ( token == null ) return; // 如果你知道类型,直接强转,对于值类型,已经重载了强转函数 int i = (int)token; string s = (string)token; JObject o = (JObject)token; JArray a = (JArray)token; // 如果不知道类型,可以通过类型判断 if ( token.Type == JTokenType.Object ) { } } // 解析 JObject public static void ParseObject(JObject obj) {