当前位置:   article > 正文

【Unity】Json解析_unity json二维数组解析

unity json二维数组解析

1 前言

        主要记录下Unity中解析json文件的方式,那么话不多说,开始吧!

2 JsonUtility

        Unity官方提供的json解析方法。用起来还好,但是解析成的对象必须是提前由我们定义好的类对象,且不能解析二维数组。

2.1 语句

        T是自定义对象。

  1. T t = JsonUtility.FromJson<T>("json字符串"); //将json解析为T对象
  2. string jsonContent = JsonUtility.ToJson(t); //将T对象解析为json

2.2 案例代码

  1. using System.Collections.Generic;
  2. using System;
  3. using UnityEngine;
  4. public class N_003_Json : MonoBehaviour
  5. {
  6. //json字符串
  7. private string jsonText;
  8. //预先创建的对象
  9. private JsonTestData jtd;
  10. private void Awake()
  11. {
  12. //初始化字符串
  13. jsonText = "{\"data\":[{\"name\":\"可露儿\",\"age\":22},{\"name\":\"塔塔露\",\"age\":21}],\"success\":true}";
  14. //初始化对象
  15. jtd = new JsonTestData();
  16. JsonTestData_Data d1 = new JsonTestData_Data();
  17. d1.name = "光呆";
  18. d1.Age = 1;
  19. JsonTestData_Data d2 = new JsonTestData_Data();
  20. d2.name = "雅喵";
  21. d2.Age = 1;
  22. List<JsonTestData_Data> list = new List<JsonTestData_Data>();
  23. list.Add(d1);
  24. list.Add(d2);
  25. jtd.data = list;
  26. jtd.success = true;
  27. }
  28. //绘制UI
  29. private void OnGUI()
  30. {
  31. //绘制按钮,使用JsonUtility将Json字符串转为对象
  32. if (GUI.Button(new Rect(120, 10, 150, 20), "JsonUtility To Object"))
  33. {
  34. //将json字符串转换为特定对象
  35. JsonTestData jd = JsonUtility.FromJson<JsonTestData>(jsonText);
  36. //打印输出
  37. Debug.Log("转换为对象!");
  38. Debug.Log("数据请求是否成功:" + jd.success);
  39. Debug.Log("姓名:" + jd.data[0].name + ",年龄:" + jd.data[0].Age);
  40. Debug.Log("姓名:" + jd.data[1].name + ",年龄:" + jd.data[1].Age);
  41. }
  42. //绘制按钮,使用JsonUtility将对象转为Json字符串
  43. if (GUI.Button(new Rect(120, 50, 150, 20), "JsonUtility To Json"))
  44. {
  45. //将对象转为json字符串
  46. string jsonContent = JsonUtility.ToJson(jtd);
  47. //打印输出
  48. Debug.Log("转换为字符串!");
  49. Debug.Log(jsonContent);
  50. }
  51. }
  52. }
  53. //自定义的类对象
  54. [Serializable] //涉及到序列化的类,需要加上此标签
  55. public class JsonTestData
  56. {
  57. public List<JsonTestData_Data> data;
  58. public bool success;
  59. }
  60. [Serializable]
  61. public class JsonTestData_Data
  62. {
  63. public string name;
  64. [SerializeField] //类中对象想要参与序列化,要么是public,要么是加上此标签
  65. private int age;
  66. public int Age { get { return age; } set { age = value; } }
  67. }

2.3 案例演示

        前面就说了,解析成的对象必须是我们自定义的类对象,而且也不能解析二维数组,即对象内若包含了二维数组对象(嵌套list),就会出错。基于以上的问题,有的时候JsonUtility是并不能满足需求的,所以还有另外一个解析方法:JsonConvert。

3 JsonConvert

        可解析成通用对象,可解析二维数组。

3.1 安装包

        需要在Unity PackageManager中把包给安装了才能使用JsonConvert。如图:

安装完成后,在代码文件中引入如下命名空间:

  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;

3.2 语句

        设对象为object。

  1. object ob = JsonConvert.DeserializeObject<object>("json字符串"); //将json解析为T对象
  2. string jsonContent = JsonConvert.SerializeObject(ob); //将T对象解析为json

这里需要特别说下object。JsonConvert与JsonUtility不同,它所提供的对象类型是很自由的,这里的object类型可以是:

  1. JObject对象(来自Newtonsoft.Json.Linq;)
  2. 自定义类对象
  3. JArray对象(来自Newtonsoft.Json.Linq;)(数组)(可多维)
  4. 数组(可多维)
  5. 集合(可多维)
  6. 字典
  7. ·······

以上只是我所知道的,特别讲下JObject、JArray。多说无益,直接看案例代码吧,通俗易懂好吧 !

3.3 案例代码

  1. using UnityEngine;
  2. using Newtonsoft.Json;
  3. using Newtonsoft.Json.Linq;
  4. public class N_003_Json : MonoBehaviour
  5. {
  6. //json字符串
  7. private string jsonText;
  8. //预先创建的对象
  9. private JObject jtd;
  10. private void Awake()
  11. {
  12. //初始化字符串
  13. jsonText = "{\"data\":[{\"name\":\"可露儿\",\"age\":22},{\"name\":\"塔塔露\",\"age\":21}],\"success\":true}";
  14. //创建一个JObject对象,并初始化内容
  15. jtd = new JObject();
  16. JObject d1 = new JObject();
  17. d1["name"] = "光呆";
  18. d1["age"] = 1;
  19. JObject d2 = new JObject();
  20. d2["name"] = "雅喵";
  21. d2["age"] = 1;
  22. JArray list = new JArray();
  23. list.Add(d1);
  24. list.Add(d2);
  25. jtd["data"] = list;
  26. jtd["success"] = true;
  27. }
  28. //绘制UI
  29. private void OnGUI()
  30. {
  31. //绘制按钮,使用JsonUtility将Json字符串转为对象
  32. if (GUI.Button(new Rect(120, 10, 150, 20), "JsonConvert To JObject"))
  33. {
  34. //将json字符串转换为特定对象
  35. JObject jd = JsonConvert.DeserializeObject<JObject>(jsonText);
  36. //打印输出
  37. Debug.Log("转换为对象!");
  38. Debug.Log("数据请求是否成功:" + jd["success"]);
  39. Debug.Log("姓名:" + jd["data"][0]["name"] + ",年龄:" + jd["data"][0]["age"]);
  40. Debug.Log("姓名:" + jd["data"][1]["name"] + ",年龄:" + jd["data"][1]["age"]);
  41. }
  42. //绘制按钮,使用JsonUtility将对象转为Json字符串
  43. if (GUI.Button(new Rect(120, 50, 150, 20), "JsonConvert To Json"))
  44. {
  45. //将对象转为json字符串
  46. string jsonContent = JsonConvert.SerializeObject(jtd);
  47. //打印输出
  48. Debug.Log("转换为字符串!");
  49. Debug.Log(jsonContent);
  50. }
  51. }
  52. }

        代码中使用了JObject和JArray,用这两个就不用自定义类对象了,相对来说方便一些。另外这两个是默认组合的,比如将一个json字符串转为了JObject后,若里面有数组,那么我们就把这个数组当作JArray类型即可。

3.4 案例演示

4 LitJSON

        这是一个Unity插件。也不用非要使用自定义类型,有个类似JObject的类型,然后不能解析二维数组。当时测试发现不能解析二维数组我就直接不用了,所以这里也不多介绍,感兴趣可以自己在网上搜搜相关内容。

5 结束语

        暂时先这些吧,我觉得JsonUtility、JsonConvert已经足够使用了,但用哪个还有些犹豫。个人是更倾向于使用官方提供的,毕竟是官方的,现在可能不好用,但以后可能会做对应的更新之类的,总之现在是两个都在用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/123402?site
推荐阅读
相关标签
  

闽ICP备14008679号