快速上手Unity原生Json库

现在新版的Unity(印象中是从5.3开始)已经提供了原生的Json库,以前一直使用LitJson,研究了一下Unity用的JsonUtility工具类的使用,发现使用还挺方便的,所以打算把项目中的Json库换成Unity原生的。在Unity3D开发中Json有什么用呢?下面就来说说Json在Unity中的使用。

一、Json有什么用?


Json在Unity中还是挺常用的一种数据格式的。那么,在Unity开发中哪些地方会用到Json呢?我相信没有太多编程经验的人肯定对这个问题比较感兴趣。在Unity中,有三种情况下会用到Json:

  1. 跟服务器进行数据交互
  2. 配置文件
  3. 跟Android/iOS数据交互
    目前这三种情况在我们项目中都用到了,搞明白了Json怎么用,这些都很简单,在这里就不赘述了,直接进入正题。

二、Json怎么用?


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using UnityEngine;
using System;

public class JsonExample : MonoBehaviour
{
void Start()
{
#region 序列化
MyZone myZone = new MyZone();
myZone.blogUrl = "https://davidsheh.github.io/";
myZone.blogName = "Sheh伟伟的个人博客";

Blog blog = new Blog();
blog.url = "http://davidsheh.github.io/post/快速上手Unity原生Json库/";
blog.name = "快速上手Unity原生Json库";
blog.time = DateTime.Now.ToString("yyyy-MM-dd");
myZone.blog = blog;

string json = JsonUtility.ToJson(myZone);
Debug.Log(json);
#endregion

#region 反序列化
string blogStr = Resources.Load<TextAsset>("MyZone").text;
myZone = JsonUtility.FromJson<MyZone>(blogStr);
Debug.Log(myZone.ToString());
#endregion
}
}

[Serializable]
public class MyZone
{
/// <summary>
/// 博客主页地址
/// </summary>
public string blogUrl;
/// <summary>
/// 博客名
/// </summary>
public string blogName;
/// <summary>
/// 本篇博客
/// </summary>
public Blog blog;

public override string ToString()
{
return string.Format("blogUrl:{0}, blogName:{1}, blog:{2}", blogUrl, blogName, blog.ToString());
}
}

[Serializable]
public class Blog
{
/// <summary>
/// 文章名称
/// </summary>
public string name;
/// <summary>
/// 本篇博客链接
/// </summary>
public string url;
/// <summary>
/// 博客发表时间
/// </summary>
public string time;

public override string ToString()
{
return string.Format("<name:{0}, url:{1}, time:{2}>", name, url, time);
}
}

Json文件

1
2
3
4
5
6
7
8
9
10
{
"blogUrl": "https://davidsheh.github.io/",
"blogName": "Sheh伟伟的个人博客",
"blog":
{
"name": "快速上手Unity原生Json库",
"url": " http://davidsheh.github.io/post/快速上手Unity原生Json库/",
"time": "2016-09-27"
}
}

三、性能怎么样?


More JSON Performance Benchmarks这篇文章里详细对比分析了JsonUtility、LitJson和Newtonsoft.Json三种方式的序列化和反序列化的性能。
总的来说,JsonUtility在综合表现上要略胜一筹。

四、注意事项


经过测试发现JsonUtility不支持序列化DateTime、Dictionary和Hashtable,其他类型暂时还没有测试,有兴趣的可以自行测试。

五、参考资料


Unity API
介绍 JSON

如果本文有错误之处还请帮忙指出。