# JSON 解析

  • 有关 JSON 的介绍,请看这篇文章
  • JSON 解析需要用到反射,这样就能实现 JSON 以及对应变量的动态更新。
  • JSON 的本质是一个字符串,因为有指定的格式,所以可以按照符号来切分(比如:':' 和 ' " ' 和 ',' )。这样就能获得变量的名字和对应的值。
  • 由于字符串需要经常变动,所以使用 StringBuilder

代码如下:

JSON解析
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 中下载
JSON解析
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());
            }
        }
    }
}