# JSON 解析
- 有关 JSON 的介绍,请看这篇文章
- JSON 解析需要用到反射,这样就能实现 JSON 以及对应变量的动态更新。
- JSON 的本质是一个字符串,因为有指定的格式,所以可以按照符号来切分(比如:':' 和 ' " ' 和 ',' )。这样就能获得变量的名字和对应的值。
- 由于字符串需要经常变动,所以使用 StringBuilder
代码如下:
public class JsonHelper | |
{ | |
private static StringBuilder TempStringBuilder = new StringBuilder(); | |
/// <summary> | |
/// ObjectToJson | |
/// </summary> | |
/// <param name="value"></param> | |
/// <returns></returns> | |
public static string ObjectToJson(object value) | |
{ | |
TempStringBuilder.Clear(); | |
Type type = value.GetType(); | |
PropertyInfo[] info = type.GetProperties(); | |
TempStringBuilder.Append('{'); | |
for (int i = 0; i < info.Length; i++) | |
{ | |
TempStringBuilder.AppendFormat("\"{0}\":\"{1}\",", info[i].Name, info[i].GetValue(value)); | |
} | |
TempStringBuilder.Remove(TempStringBuilder.Length - 1, 1); // 删除多余的逗号 | |
TempStringBuilder.Append('}'); | |
return TempStringBuilder.ToString(); | |
} | |
/// <summary> | |
/// JsonToObject | |
/// </summary> | |
/// <typeparam name="T"></typeparam> | |
/// <param name="json">json</param> | |
/// <returns></returns> | |
public static T JsonToObject<T>(string json) where T : new() // 泛型约束 | |
{ | |
string mainString = json.Remove(json.Length - 1, 1).Remove(0, 1).Replace("\"", string.Empty); | |
string[] values = mainString.Split(',', ':'); | |
Type type = typeof(T); // 获取类型 | |
T object_T = new T(); // 创建对象 | |
//object object_T = Activator.CreateInstance (type); // 创建对象 | |
for (int i = 0; i < values.Length; i += 2) | |
{ | |
PropertyInfo propertyInfo = type.GetProperty(values[i]); // 获取属性 | |
object IDValue = Convert.ChangeType(values[i + 1], propertyInfo.PropertyType); // 类型转换 | |
propertyInfo.SetValue(object_T, IDValue); // 设置属性 | |
} | |
return object_T; | |
} | |
} |
# Newtonsoft.Json
- 使用 Newtonsoft.Json 命名空间中的 JsonConvert.DeserializeObject 方法
- 导入 Newtonsoft.Json 命名空间:右键项目,点击 “管理 NuGet 包”,在打开的界面中搜索并下载即可
- Unity 中导入:在 Packages Manager 中下载
using Newtonsoft.Json; | |
public class Person | |
{ | |
public string Name { get; set; } | |
public int Age { get; set; } | |
public string City { get; set; } | |
} | |
public class Program | |
{ | |
public static void Main(string[] args) | |
{ | |
string json = "{\"name\":\"John\", \"age\":30, \"city\":\"New York\"}"; | |
Person person = JsonConvert.DeserializeObject<Person>(json); | |
Console.WriteLine($"Name: {person.Name}"); | |
Console.WriteLine($"Age: {person.Age}"); | |
Console.WriteLine($"City: {person.City}"); | |
} | |
} |
# LitJson
- 在官方网站中下载源码,导入项目中即可使用
using LitJson; | |
using UnityEngine; | |
namespace Default | |
{ | |
/// <summary> | |
/// LitJsonTest | |
/// </summary> | |
public class LitJsonTest : MonoBehaviour | |
{ | |
/// <summary> | |
/// Json 字符串 | |
/// </summary> | |
private string Json; | |
private void Start() | |
{ | |
//CreateJson(); | |
CreateJsonData(); | |
Debug.Log(Json); | |
ReadJson(); | |
} | |
/// <summary> | |
/// 创建 Json 对象 | |
/// </summary> | |
private void CreateJson() | |
{ | |
JsonWriter json = new JsonWriter(); | |
json.WriteObjectStart(); | |
json.WritePropertyName("name"); | |
json.Write("value"); | |
json.WritePropertyName("name_1"); | |
json.WriteObjectStart(); | |
json.WritePropertyName("name_2"); | |
json.Write("value_2"); | |
json.WriteObjectEnd(); | |
json.WritePropertyName("name_3"); | |
json.WriteArrayStart(); | |
json.Write("value_3"); | |
json.Write("value_4"); | |
json.WriteArrayEnd(); | |
json.WriteObjectEnd(); | |
Json = json.ToString(); | |
} | |
/// <summary> | |
/// 利用 JsonData 创建 Json 对象 | |
/// </summary> | |
private void CreateJsonData() | |
{ | |
// 方法一 | |
//JsonData data = new JsonData(); | |
//data["name"] = "Value"; | |
//JsonData data_1 = new JsonData(); | |
//data_1["name_2"] = "value_2"; | |
//data["name_1"] = data_1; | |
//JsonData data_2 = new JsonData | |
//{ | |
// "value_3", | |
// "value_4" | |
//}; | |
////data_2.Add("value_3"); | |
////data_2.Add("value_4"); | |
//data["name_3"] = data_2; | |
// 方法二 | |
JsonData data = new JsonData(); | |
data["name"] = "Value"; | |
data["name_1"] = new JsonData(); | |
data["name_1"]["name_2"] = "value_2"; | |
data["name_3"] = new JsonData | |
{ | |
"value_3", | |
"value_4" | |
}; | |
Json = data.ToJson(); | |
} | |
/// <summary> | |
/// 解析 Json | |
/// </summary> | |
private void ReadJson() | |
{ | |
// 方法一 | |
//JsonData json = JsonMapper.ToObject(Json); | |
//Debug.Log(json["name"].ToString()); | |
//JsonData json_1 = json["name_1"]; | |
//Debug.Log(json_1["name_2"].ToString()); | |
//JsonData json_2 = json["name_3"]; | |
//foreach (var item in json_2) | |
//{ | |
// Debug.Log(item.ToString()); | |
//} | |
// 方法二 | |
JsonData json = JsonMapper.ToObject(Json); | |
Debug.Log(json["name"].ToString()); | |
Debug.Log(json["name_1"]["name_2"].ToString()); | |
foreach (var item in json["name_3"]) | |
{ | |
Debug.Log(item.ToString()); | |
} | |
} | |
} | |
} |