alwaystest / Blog

24 stars 2 forks source link

Unity3D 处理JSON 之 SimpleJSON #23

Open alwaystest opened 8 years ago

alwaystest commented 8 years ago

Unity3D 处理JSON 之 SimpleJSON

标签(空格分隔): Unity3D JSON


简介

在使用Unity3D来处理JSON的序列化与反序列化的时候,Unity官方提供了JsonUtility^footnote。据官方称,效率要比市面上的JSON处理插件高。但是我具体使用的时候发现JsonUtility反序列化需要使用泛型,必须有一个模板类,而且没有发现反序列化属性别名的方法, 为了方便开发,我选取了SimpleJSON来进行JSON字符串的处理。

SimpleJSON的这个页面提供了一个简单的Example,简单到都没有提供手动Add("key","value")的用法。我在讨论界面Test类中找到了相关的用法,在页面的最底部。

我个人比较喜欢Google Style的JSON风格

双引号 使用双引号 如果(某个)属性需要引号,则必须使用双引号。所有的属性名必须在双引号内。字符类型的属性值必须使用双引号。其它类型值(如布尔或数字)不应该使用双引号。

而SimpleJSON处理出来的JSON风格是把数字,布尔值也使用双引号的。

JAVA转C#的坑

JAVA代码

System.out.println(obj);

这样的代码,如果传入的参数是任何一个非String类型的对象,会自动调用其toString(),将其转换为字符串。

而在C#中,有implicit这么一个神奇的东西,我简单的把他理解为和C++的操作符重载类似的东西。

SimpleJSON中有这么一段代码:

public static implicit operator string(JSONNode d)
{
    return (d == null)?null:d.Value;
}

public static class JSON
{
   public static JSONNode Parse(string aJSON)
    {
        return JSONNode.Parse(aJSON);
    }
}

导致下面的代码会出现不同的结果

JSONArray arr = json ["hello"].AsArray;

Debug.Log(JSON.Parse(arr[0]));
Debug.Log(JSON.Parse(arr[0].ToString()));//JSONNode重写了ToString()方法,其实现和implicit不同。