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.
JsonUtilityadalah API ringan. Hanya tipe sederhana yang didukung. Itu tidak mendukung koleksi seperti Kamus. Satu pengecualian adalah List. Ini mendukung Listdan Listarray!
Jika Anda perlu membuat serial Dictionaryatau 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 trueke JsonUtility.ToJsonfungsi 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.FromJsonOverwritedigunakan, 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 playerIdmuncul lebih dari sekali . Unity JsonUtilitytidak 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 JsonUtilitytidak mendukung ini karena properti "15m" dimulai dengan angka. Variabel kelas tidak dapat dimulai dengan bilangan bulat.
Unduh SimpleJSON.csdari 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.ToJsonsebagai 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.FromJsonsebagai ganti JsonUtility.FromJson.
B . Jika Anda mendapatkan NullReferenceExceptionwaktu 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.Lengthuntuk memeriksa panjangnya sebelum mengaksesnya.
CATATAN: Hapus { get; set; } dari playerkelas. Jika sudah { get; set; }, itu tidak akan berhasil. Unity JsonUtilitytidak 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.