Unity menambahkan JsonUtility ke API mereka setelah Pembaruan 5.3.3 . Lupakan semua pustaka pihak ketiga kecuali Anda melakukan sesuatu yang lebih rumit. JsonUtility lebih cepat daripada perpustakaan Json lainnya. Perbarui ke versi Unity 5.3.3 atau lebih tinggi, lalu coba solusi di bawah ini.
JsonUtility
adalah API ringan. Hanya tipe sederhana yang didukung. Itu tidak mendukung koleksi seperti Kamus. Satu pengecualian adalah List
. Ini mendukung List
dan List
array!
Jika Anda perlu membuat serial Dictionary
atau melakukan sesuatu selain hanya membuat serial dan deserialisasi tipe data sederhana, gunakan API pihak ketiga. Jika tidak, lanjutkan membaca.
Contoh kelas untuk membuat serial:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. SATU OBYEK DATA (NON-ARRAY JSON)
Serialisasi Bagian A :
Serialisasi ke Json dengan public static string ToJson(object obj);
metode.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
Keluaran :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Serialisasi Bagian B :
Serialisasi ke Json dengan public static string ToJson(object obj, bool prettyPrint);
metode overload. Hanya meneruskan true
ke JsonUtility.ToJson
fungsi tersebut akan memformat data. Bandingkan keluaran di bawah dengan keluaran di atas.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Keluaran :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Deserialisasi Bagian A :
Deserialisasi json dengan public static T FromJson(string json);
metode overload.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Deserialisasi Bagian B :
Deserialisasi json dengan public static object FromJson(string json, Type type);
metode overload.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Deserialisasi Bagian C :
Deserialisasi json dengan public static void FromJsonOverwrite(string json, object objectToOverwrite);
metode. Saat JsonUtility.FromJsonOverwrite
digunakan, tidak ada instance baru dari Objek yang Anda deserialisasi akan dibuat. Ini hanya akan menggunakan kembali contoh yang Anda berikan dan menimpa nilainya.
Ini efisien dan harus digunakan jika memungkinkan.
Player playerInstance;
void Start()
{
playerInstance = new Player();
deserialize();
}
void deserialize()
{
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
JsonUtility.FromJsonOverwrite(jsonString, playerInstance);
Debug.Log(playerInstance.playerLoc);
}
2. GANDA DATA (ARRAY JSON)
Json Anda berisi beberapa objek data. Misalnya playerId
muncul lebih dari sekali . Unity JsonUtility
tidak mendukung array yang karena masih baru tapi Anda dapat menggunakan penolong kelas dari orang ini untuk mendapatkan berbagai bekerja dengan JsonUtility
.
Buat kelas bernama JsonHelper
. Salin JsonHelper langsung dari bawah.
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;
}
}
Serialisasi Json Array :
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";
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Keluaran :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Deserialisasi Json Array :
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);
Keluaran :
Powai
Pengguna2
Jika ini adalah array Json dari server dan Anda tidak membuatnya dengan tangan :
Anda mungkin harus menambahkan {"Items":
di depan string yang diterima lalu menambahkan }
di akhir.
Saya membuat fungsi sederhana untuk ini:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
maka Anda dapat menggunakannya:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3. Deserialisasi string json tanpa class && De-serializing Json dengan properti numerik
Ini adalah Json yang dimulai dengan angka atau properti numerik.
Sebagai contoh:
{
"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 JsonUtility
tidak mendukung ini karena properti "15m" dimulai dengan angka. Variabel kelas tidak dapat dimulai dengan bilangan bulat.
Unduh SimpleJSON.cs
dari wiki Unity .
Untuk mendapatkan properti "15 juta" dari USD:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Untuk mendapatkan properti "15m" dari ISK:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Untuk mendapatkan properti "15m" dari NZD:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Properti Json lainnya yang tidak dimulai dengan digit numerik dapat ditangani oleh JsonUtility Unity.
4. PEMECAHAN MASALAH JsonUtility:
Masalah saat membuat serial dengan JsonUtility.ToJson
?
Mendapatkan string kosong atau " {}
" dengan JsonUtility.ToJson
?
A . Pastikan bahwa kelas tersebut bukan array. Jika ya, gunakan kelas helper di atas dengan JsonHelper.ToJson
sebagai ganti JsonUtility.ToJson
.
B . Tambahkan [Serializable]
ke atas kelas Anda membuat serial.
C . Hapus properti dari kelas. Misalnya, di variabel, public string playerId { get; set; }
hapus { get; set; }
. Unity tidak dapat membuat serial ini.
Masalah saat melakukan deserialisasi JsonUtility.FromJson
?
A . Jika Anda mendapatkan Null
, pastikan bahwa Json bukan array Json. Jika ya, gunakan kelas helper di atas dengan JsonHelper.FromJson
sebagai ganti JsonUtility.FromJson
.
B . Jika Anda mendapatkan NullReferenceException
waktu deserialisasi, tambahkan [Serializable]
ke bagian atas kelas.
C. Masalah lainnya, pastikan json Anda valid. Buka situs ini di sini dan tempel json. Ini akan menunjukkan kepada Anda apakah json valid. Itu juga harus menghasilkan kelas yang tepat dengan Json. Pastikan untuk menghapus remove { get; set; }
dari setiap variabel dan juga tambahkan [Serializable]
ke bagian atas setiap kelas yang dihasilkan.
Newtonsoft.Json:
Jika karena alasan tertentu Newtonsoft.Json harus digunakan, periksa versi fork untuk Unity di sini . Perhatikan bahwa Anda mungkin mengalami crash jika fitur tertentu digunakan. Hati-hati.
Untuk menjawab pertanyaan Anda :
Data asli Anda adalah
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Tambahkan {"Items":
di depannya lalu tambahkan }
di ujungnya .
Kode untuk melakukan ini:
serviceData = "{\"Items\":" + serviceData + "}";
Sekarang kamu punya:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Untuk cerita bersambung yang beberapa data dari php sebagai array , Anda sekarang dapat melakukan
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
adalah data pertamamu
playerInstance[1]
adalah data kedua Anda
playerInstance[2]
adalah data ketiga Anda
atau data di dalam kelas dengan playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
Anda dapat menggunakan playerInstance.Length
untuk memeriksa panjangnya sebelum mengaksesnya.
CATATAN: Hapus { get; set; }
dari player
kelas. Jika sudah { get; set; }
, itu tidak akan berhasil. Unity JsonUtility
tidak TIDAK bekerja dengan anggota kelas yang didefinisikan sebagai sifat .
[
dan]
? Itulah yang membuatnya menjadi sebuah daftar. Berhenti saja menghapusnya, dan deserialize sebagai array atau daftar dan saya berharap itu baik-baik saja. Silakan posting kode yang Anda coba.