跳至正文

Unity读取和解析JSON文件(1)-JSON和对象的转换

  • Unity
  • Unity版本:2018.4.17
  • LitJson:几乎适用于Unity所有版本 (下载地址

JSON是一种轻量级的文本数据格式,跟语言和平台无关,在项目中使用非常广泛。不过Unity引擎和C#语言本身并没有针对JSON提供太方便的使用接口,幸好Unity插件商店里可以找到很多。其中的LitJSON就是一个流行的Unity插件,可以方便、快速地进行JSON和对象之间的转换。

安装

LitJSON插件是一个Dll文件,在工程Assets下新建一个Plugins目录,右键"Import New Asset"把LitJSON.dll导入,然后在调用代码处引入它的命名空间

using LitJSON;

即可开始使用了。

JSON和对象的转换

LitJSON有个JsonMapper类,该类为实现JSON -> 对象对象->JSON的转换提供了两个主要方法,JsonMapper.ToObjectJsonMapper.ToJson

JSON文件 -> 对象

例如,以下一个JSON文件,如何应用在项目中呢?

{
    "Age"   : 57,
    "Name"  : "iam bill"
}

自然地,我们会想到首先要加载该文件,并创建类对象,然后根据文件内容给对象赋值,之后该对象就可以使用了。

现在先把类定义出来,类名为 Person

public class Person 
{
    public int Age { get; set; }
    public string Name { get; set; }
}

可以看到,类的成员和JSON内容一一对应,这样才能互相转换。

而JSON文件的加载,Unity引擎提供了 Resources.Load 方法。

假设该JSON文件名为bill.json,存放路径为 Assets/Resources/bill.json,则加载且转换为Person对象的代码如下。

// 读取JSON文件并转换成Person对象
// bill.json 文件放在 Assets/Resources 路径下
void JsonFileToPerson()
{
    TextAsset text = Resources.Load("bill"); // 以文本方式加载
    Person bill = JsonMapper.ToObject(text.text);
    Debug.LogFormat("JsonFileToPerson: Age={0}, Name={1}", bill.Age, bill.Name);
}

输出Log如下

JsonFileToPerson: Age=57, Name=iam bill

JSON字符串 -> 对象

上一段讲了如何把JSON文件转换为对象。那如果是一个字符串,如何转换为对象呢?示例代码如下。

// 把JSON字符串转换成Person对象
void JsonStrToPerson() 
{
    string jsonStr = @"
        {
            ""Age""     : 57,
            ""Name""    : ""iam bill""
        }";
    Person bill = JsonMapper.ToObject(jsonStr);
    Debug.LogFormat("JsonStrToPerson: Age={0}, Name={1}", bill.Age, bill.Name);
}

输出Log如下

JsonStrToPerson: Age=57, Name=iam bill

对象 -> JSON字符串

把对象转换为JSON字符串

// 把Person对象转成JSON字符串
void PersonToJsonStr() 
{
    Person bill = new Person();
    bill.Age = 57;
    bill.Name = "iam bill";
    string jsonStr = JsonMapper.ToJson(bill);
    Debug.LogFormat("PersonToJsonStr: json={0}", jsonStr);
}

最后,本文的所有完整代码如下:

using UnityEngine;
using LitJson;

public class Person 
{
    public int Age { get; set; }
    public string Name { get; set; }
}

public class TestJson : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        JsonStrToPerson();
        JsonFileToPerson();
        PersonToJsonStr();
    }

    // 把JSON字符串转换成Person对象
    void JsonStrToPerson() 
    {
        string jsonStr = @"
            {
                ""Age""     : 57,
                ""Name""    : ""iam bill""
            }";
        Person bill = JsonMapper.ToObject(jsonStr);
        Debug.LogFormat("JsonStrToPerson: Age={0}, Name={1}", bill.Age, bill.Name);
    }

    // 读取JSON文件并转换成Person对象
    // bill.json 文件放在 Assets/Resources 路径下
    void JsonFileToPerson()
    {
        TextAsset text = Resources.Load("bill");
        Person bill = JsonMapper.ToObject(text.text);
        Debug.LogFormat("JsonFileToPerson: Age={0}, Name={1}", bill.Age, bill.Name);
    }

    // 把Person对象转成JSON字符串
    void PersonToJsonStr() 
    {
        Person bill = new Person();
        bill.Age = 57;
        bill.Name = "iam bill";
        string jsonStr = JsonMapper.ToJson(bill);
        Debug.LogFormat("PersonToJsonStr: json={0}", jsonStr);
    }
}
标签:

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注