Unityは5.3.3アップデート後にAPIにJsonUtilityを追加しました。より複雑なことをしているのでない限り、サードパーティのライブラリはすべて忘れてください。JsonUtilityは他のJsonライブラリよりも高速です。Unity 5.3.3に更新バージョン以上に、以下の解決策を試してください。
JsonUtility
軽量APIです。単純型のみがサポートされています。辞書などのコレクションはサポートしていません。1つの例外はList
です。対応List
・List
配列!
をシリアル化する必要がある場合、Dictionary
または単純なデータ型をシリアル化および逆シリアル化する以外の何かを行う必要がある場合は、サードパーティのAPIを使用します。それ以外の場合は、読み続けてください。
シリアル化するクラスの例:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. 1つのデータオブジェクト(非アレイJSON)
パートAのシリアル化:
public static string ToJson(object obj);
メソッドを使用してJsonにシリアル化します。
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のシリアル化:
public static string ToJson(object obj, bool prettyPrint);
メソッドオーバーロードでJsonにシリアル化します。単純に渡すtrue
にJsonUtility.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のデシリアライズ:
public static T FromJson(string json);
メソッドオーバーロードでjsonをデシリアライズします。
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
パートBのデシリアライズ:
public static object FromJson(string json, Type type);
メソッドオーバーロードでjsonをデシリアライズします。
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
パートCの逆シリアル化:
public static void FromJsonOverwrite(string json, object objectToOverwrite);
メソッドでjsonをデシリアライズします。ときに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.複数のデータ(ARRAY JSON)
Jsonには複数のデータオブジェクトが含まれています。たとえば、playerId
複数回登場しました。Unity JsonUtility
はまだ新しいので配列をサポートしていませんが、この人のヘルパークラスを使用して配列をで動作させることができますJsonUtility
。
というクラスを作成します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 = "{\r\n \"Items\": [\r\n {\r\n \"playerId\": \"8484239823\",\r\n \"playerLoc\": \"Powai\",\r\n \"playerNick\": \"Random Nick\"\r\n },\r\n {\r\n \"playerId\": \"512343283\",\r\n \"playerLoc\": \"User2\",\r\n \"playerNick\": \"Rand Nick 2\"\r\n }\r\n ]\r\n}";
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" : "$"}
}
JsonUtility
「15m」プロパティは数字で始まるため、Unity はこれをサポートしていません。クラス変数を整数で始めることはできません。
SimpleJSON.cs
Unityのwikiからダウンロード。
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);
数字で始まっていない残りのJsonプロパティは、UnityのJsonUtilityで処理できます。
4. JsonUtilityのトラブルシューティング:
問題とシリアル化JsonUtility.ToJson
?
空の文字列または " {}
"を取得していJsonUtility.ToJson
ますか?
A。クラスが配列でないことを確認してください。もしそうなら、のJsonHelper.ToJson
代わりに上記のヘルパークラスを使用してくださいJsonUtility.ToJson
。
B。[Serializable]
シリアル化するクラスの先頭に追加します。
C。クラスからプロパティを削除します。たとえば、変数でをpublic string playerId { get; set; }
削除し { get; set; }
ます。Unityはこれをシリアル化できません。
問題とデシリアライズJsonUtility.FromJson
?
A。を取得した場合Null
は、JsonがJson配列でないことを確認してください。もしそうなら、のJsonHelper.FromJson
代わりに上記のヘルパークラスを使用してくださいJsonUtility.FromJson
。
B。NullReferenceException
逆シリアル化中に取得した場合[Serializable]
は、クラスの先頭に追加します。
C .ANY他の問題は、あなたのJSONが有効であることを確認します。このサイトにアクセスし、こことJSONを貼り付けます。jsonが有効かどうかが表示されます。また、Jsonを使用して適切なクラスを生成する必要があります。各変数からremoveを削除 し、生成された各クラスの先頭に{ get; set; }
追加することを確認してください [Serializable]
。
Newtonsoft.Json:
何らかの理由でNewtonsoft.Jsonを使用する必要がある場合は、Unityのフォークバージョンをこちらで確認してください。特定の機能を使用すると、クラッシュが発生する可能性があることに注意してください。注意してください。
あなたの質問に答えるには:
元のデータは
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
追加 {"Items":
でフロントその後の追加 }
で終わり、それの。
これを行うコード:
serviceData = "{\"Items\":" + serviceData + "}";
今あなたは持っています:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
するためにシリアライズ複数としてPHPからのデータ配列を、あなたが今できること
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
あなたの最初のデータです
playerInstance[1]
あなたの2番目のデータです
playerInstance[2]
あなたの3番目のデータです
またはを持つクラス内のデータplayerInstance[0].playerLoc
、playerInstance[1].playerLoc
、playerInstance[2].playerLoc
......
playerInstance.Length
アクセスする前に長さを確認するために使用できます。
注: クラスから削除 { get; set; }
しplayer
ます。あなたが持っている場合{ get; set; }
、それは動作しません。Unity は、プロパティとして定義されているクラスメンバーではJsonUtility
機能しません。
[
と]
?それがリストになっています。それを削除するのをやめて、配列またはリストとして逆シリアル化すれば、問題ないはずです。試したコードを投稿してください。