Unity的JSON工具类+LitJson的引入及使用

发布于:2025-03-24 ⋅ 阅读:(28) ⋅ 点赞:(0)
C#使用JSON数据

        数据存储(序列化):将C#的数据格式,转化为JSON字符串,存储或传输

        数据使用(反序列化):将JSON字符串中存储的数据,转化为C#可用的数据格式,实现代码逻辑

序列化(程序数据->JSON字符串)

反序列化(JSON字符串->程序数据)

Unity的JSON工具

        类名:JsonUtility

        序列化:ToJson()

//测试序列化(C#->JSON数据)
public void Serialize()
{
    //需要有C#数据
    OneRow data=new OneRow();
    data.Num=2;
    data.Name="呵呵";
    data.IsWoman="false";
    
    //将数据传递给JSON工具,会解析为JSON字符串,可用于存储或传输
    //参数1:C#数据
    //参数2:是否将JSON字符串格式化
    string j= JsonUtility.ToJson(data);
    Debug.Log(j);
}

反序列化:FromJson()

数据:string j="{\"Num\":1, \"Name\":\"root\", \"IsWoman\":false}";

C#与JSON对应的数据类型

//告诉Unity的JSON工具,解析JSON后,将数据存储在这个类型的对象中
public class OneRow
{
    public int Num;
    public string Name;
    public bool IsWoman;
}  
//解析JSON为C#对象
//因为JsonUtility.FromJson<T>()需要提供C#数据类型与JSON对应,所以需要在C#中定义数据类型
//将j变量中存储的JSON结构,转化为C#的OneRow类型数据
//T:C#接收类型
//参数:JSON字符串
OneRow data=JsonUtility.FromJson<OneRow>(j);
Debug.Log(data.Name);

注意:如果使用了Unity的内置解析类,JSON最外层结构必须是对象结构

当一个类需要存储在另外一个成员变量中时,需要给类声明加特性

[System.Serializable]     //类产生的对象数据,可以被序列化后存储

LitJson使用

        官网

                https://litjson.net/

https://github.com/LitJSON/litjson (看运气网址)

 导入src文件夹中的Csharp文件到Unity项目的Assets文件中

NuGet Gallery | LitJson.Source 0.19.0

出现以下警告,将下图中的该行注释即可:

序列化

        JsonMapper.ToJson();

反序列化

        获得JsonData(类似C#的object):JsonMapper.ToObject() 

        获得指定类型:JsonMapper.ToObject<T>()

注意

        反序列化不要求最外层是对象

        对象内部存储对象不需要[System.Serializable]修饰Class声明

LitJson(JsonMapper.ToObject<T>())示例:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;

public class TestJson : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/JsonItem");
        string json = asset.text;
        List<int> data=JsonMapper.ToObject<List<int>>(json);
        Debug.Log(data[0]);
    }
}

LitJson(JsonMapper.ToObject())示例:引用前文的JSON道具数据(稍作修改)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using LitJson;

public class TestJson : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        //TestJsonData();
        TestItem();
    }
    public void TestJsonData()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/JsonItem");
        string json = asset.text;
        JsonData data=JsonMapper.ToObject(json);
        Debug.Log(data[0]);
    }
    void TestItem()
    {
        TextAsset asset = Resources.Load<TextAsset>("Json/WItem");
        string json = asset.text;
        JsonData data = JsonMapper.ToObject(json);
        Debug.Log(data[1]["Description"]);
    }
}

C#数据转json(litJson):

void TestToJson()
    {
        Debug.Log(JsonMapper.ToJson(new List<int> { 111, 222, 333 }));
        Debug.Log(JsonMapper.ToJson(new Dictionary<int, string> { { 1, "aa" }, { 2, "bb" },{ 3,"cc"} }));

        JsonData data = new JsonData();
        data["User"] = "admin";
        data["id"] = 123;
        data["Password"] = "15999";
        data["Des"] = null;
        Debug.Log(data.ToJson());
    }

TextAsset可以接受的文件类型

.txt    .html    .htm   .xml   .bytes     .json     .csv   .yaml   .fnt

该系列专栏为网课课程笔记,仅用于学习参考。