JsonUtility
你可以用JsonUtility,但是可能会如到困难。
JsonUtility是一个轻量级的 API。仅支持简单类型。它不支持 Dictionary,嵌套数组等集合。
要序列化的示例类:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. 一个数据对象(非数组 JSON)
序列化 A 部分:
使用公共静态字符串序列化为 Json(对象 obj); 方法。
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
输出:
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
序列化 B 部分:
使用公共静态字符串序列化为 Json(object obj, bool prettyPrint); 方法重载。只需传递给函数即可格式化数据。将下面的输出与上面的输出进行比较。trueJsonUtility.ToJson
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
//Convert to JSON
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
输出:
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
反序列化 A 部分:
使用公共静态 T 反序列化 json(string json); 方法重载。
string jsonString = "{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
反序列化 B 部分:
使用公共静态对象反序列化 json(string json, Type type); 方法重载。
string jsonString = "{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
反序列化 C 部分:
使用公共静态 void 反序列化 json FromJsonOverwrite(string json, object objectToOverwrite); 方法。使用时,不会创建要反序列化的该对象的新实例。它只会重用您传入的实例并覆盖其值。JsonUtility.FromJsonOverwrite
这是有效的,如果可能的话,应该使用。
Player playerInstance;
void Start()
{
//Must create instance once
playerInstance = new Player();
deserialize();
}
void deserialize()
{
string jsonString = "{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}";
//Overwrite the values in the existing class instance "playerInstance". Less memory Allocation
JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
Debug.Log(playerInstance.playerLoc);
}
2. 多数据(数组JSON)
Json 包含多个数据对象。例如,出现不止一次。Unity 不支持数组,因为它仍然是新的,但您可以使用此人的帮助程序类来使数组与 .playerIdJsonUtilityJsonUtility
创建一个名为 的类。直接从下面复制 JsonHelper。JsonHelper
public static class JsonHelper
{
public static T[] FromJson<T>(string json)
{
Wrapper<T> wrapper = JsonUtility.FromJson<Wrapper<T>>(json);
return wrapper.Items;
}
public static string ToJson<T>(T[] array)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper);
}
public static string ToJson<T>(T[] array, bool prettyPrint)
{
Wrapper<T> wrapper = new Wrapper<T>();
wrapper.Items = array;
return JsonUtility.ToJson(wrapper, prettyPrint);
}
[Serializable]
private class Wrapper<T>
{
public T[] Items;
}
}
序列化 Json 数组:
Player[] playerInstance = new Player[2];
playerInstance[0] = new Player();
playerInstance[0].playerId = "8484239823";
playerInstance[0].playerLoc = "Powai";
playerInstance[0].playerNick = "Random Nick";
playerInstance[1] = new Player();
playerInstance[1].playerId = "512343283";
playerInstance[1].playerLoc = "User2";
playerInstance[1].playerNick = "Rand Nick 2";
//Convert to JSON
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);
输出:
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
反序列化 Json 数组:
string jsonString = "{rn "Items": [rn {rn "playerId": "8484239823",rn "playerLoc": "Powai",rn "playerNick": "Random Nick"rn },rn {rn "playerId": "512343283",rn "playerLoc": "User2",rn "playerNick": "Rand Nick 2"rn }rn ]rn}";
Player[] player = JsonHelper.FromJson<Player>(jsonString);
Debug.Log(player[0].playerLoc);
Debug.Log(player[1].playerLoc);
输出:
波威
用户 2
如果这是来自服务器的 Json 数组,并且您不是手动创建的:
您可能需要在收到的字符串前面添加,然后在其末尾添加。{“Items”:}
我为此做了一个简单的函数:
string fixJson(string value)
{
value = "{"Items":" + value + "}";
return value;
}
然后你可以使用它:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3. 反序列化不带类的json字符串 &&使用数值属性反序列化Json
这是一个以数字或数值属性开头的 Json。
例如:
{
"USD" : {"15m" : 1740.01, "last" : 1740.01, "buy" : 1740.01, "sell" : 1744.74, "symbol" : "$"},
"ISK" : {"15m" : 179479.11, "last" : 179479.11, "buy" : 179479.11, "sell" : 179967, "symbol" : "kr"},
"NZD" : {"15m" : 2522.84, "last" : 2522.84, "buy" : 2522.84, "sell" : 2529.69, "symbol" : "$"}
}
Unity 不支持此功能,因为“15m”属性以数字开头。类变量不能以整数开头。JsonUtility
从 Unity 的 wiki 下载SimpleJSON.cs。
// 要获得 USD 的“15m”属性:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
// 要获取 ISK 的“15m”属性,请执行以下操作:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
// 要获得 NZD 的“15m”属性:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Newtonsoft.Json
如果由于某种原因必须使用 Newtonsoft.Json,则自 2022 年 2 月起,现在可以直接从 Unity 从以下位置获取:com.unity.nuget.newtonsoft-json@3.0。只需通过包管理器添加即可。