Unity eklendi JsonUtility'yi 5.3.3 Güncellemesinden sonra API'sine . Daha karmaşık bir şey yapmadığınız sürece tüm 3. taraf kitaplıklarını unutun. JsonUtility, diğer Json kitaplıklarından daha hızlıdır. Unity 5.3.3 sürümüne veya üstüne güncelleyin ve ardından aşağıdaki çözümü deneyin.
JsonUtility
hafif bir API'dir. Yalnızca basit türler desteklenir. O mu değil böyle Sözlük olarak koleksiyonları destekler. Bunun bir istisnası List
. Destekler List
ve List
dizi!
Dictionary
Basit veri türlerini seri hale getirmeniz veya seri durumdan çıkarmanız dışında bir şey yapmanız gerekirse , üçüncü taraf bir API kullanın. Aksi takdirde okumaya devam edin.
Serileştirilecek örnek sınıf:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. BİR VERİ NESNESİ (ARRAY OLMAYAN JSON)
Bölüm A Serileştirme :
public static string ToJson(object obj);
Yöntemle Json'a seri hale getirin .
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
Çıktı :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Bölüm B Diziselleştirme :
public static string ToJson(object obj, bool prettyPrint);
Yöntem aşırı yüklemesiyle Json'a seri hale getirin . Basitçe geçen true
etmek JsonUtility.ToJson
fonksiyonu verileri biçimlendirir. Aşağıdaki çıktıyı yukarıdaki çıktıyla karşılaştırın.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Çıktı :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Seri Durumdan Çıkarma A Bölümü :
public static T FromJson(string json);
Aşırı yöntem yüklemesiyle json serisini kaldırın .
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Seriyi Kaldırma B Bölümü :
public static object FromJson(string json, Type type);
Aşırı yöntem yüklemesiyle json serisini kaldırın .
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Seri Durumdan Çıkarma C Bölümü :
İle json serisini kaldırpublic static void FromJsonOverwrite(string json, object objectToOverwrite);
Yöntemle . Ne zaman JsonUtility.FromJsonOverwrite
kullanılır, sen deserializing olduğunu Nesne yeni bir örneğinin oluşturulacak için. Geçtiğiniz örneği yeniden kullanır ve değerlerinin üzerine yazar.
Bu etkilidir ve mümkünse kullanılmalıdır.
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. ÇOKLU VERİ (ARRAY JSON)
Json'unuz birden çok veri nesnesi içerir. Örneğin, playerId
birden fazla kez ortaya çıktı . Unity JsonUtility
, diziyi hala yeni olduğu için desteklemiyor, ancak dizi almak için bu kişiden bir yardımcı sınıf kullanabilirsiniz. çalışmakJsonUtility
.
Adlı bir sınıf oluşturun JsonHelper
. JsonHelper'ı doğrudan aşağıdan kopyalayın.
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 Dizisini Seri Hale Getirme :
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);
Çıktı :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Json Array serisini kaldırma :
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);
Çıktı :
Powai
Kullanıcı2
Bu sunucudan bir Json dizisiyse ve onu elle oluşturmadıysanız :
{"Items":
Alınan dizenin önüne Eklemeniz ve ardından eklemeniz gerekebilir}
sonuna .
Bunun için basit bir işlev yaptım:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
o zaman kullanabilirsiniz:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3. json dizesini sınıfsız ve& Json'u sayısal özelliklerle serileştirmeden kaldır
Bu, bir sayı veya sayısal özelliklerle başlayan bir Json'dur.
Örneğin:
{
"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" : "$"}
}
Birlik JsonUtility
bunu desteklemez çünkü "15m" özelliği bir sayı ile başlar. Bir sınıf değişkeni bir tamsayı ile başlayamaz.
SimpleJSON.cs
Unity'nin wiki'sinden indirin .
USD'nin "15 milyon" mülkü almak için:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
ISK'nın "15m" özelliğini almak için:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
NZD'nin "15 milyon" mülkü almak için:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Sayısal bir rakamla başlamayan geri kalan Json özellikleri, Unity'nin JsonUtility tarafından işlenebilir.
4. SORUN GİDERME SORUNU:
İle seri hale getirirken sorun JsonUtility.ToJson
mu yaşıyorsunuz ?
Boş dize mi alıyorsunuz yoksa " {}
" ile JsonUtility.ToJson
mi?
Bir . Sınıfın bir dizi olmadığından emin olun. Eğer öyleyse, JsonHelper.ToJson
yerine yukarıdaki yardımcı sınıfı kullanın JsonUtility.ToJson
.
B . [Serializable]
Serileştirdiğiniz sınıfın en üstüne ekleyin .
C . Sınıftan özelliği kaldırın. Örneğin, değişkendeki public string playerId { get; set; }
kaldırın { get; set; }
. Unity bunu seri hale getiremez.
Seri durumdan çıkarılırken karşılaşılan sorunlar JsonUtility.FromJson
?
Bir . Eğer alırsanız Null
, Json'un bir Json dizisi olmadığından emin olun. Eğer öyleyse, JsonHelper.FromJson
yerine yukarıdaki yardımcı sınıfı kullanın JsonUtility.FromJson
.
B . NullReferenceException
Seri durumdan çıkarılırken alırsanız [Serializable]
, sınıfın en üstüne ekleyin .
C. Diğer sorunlar, json'unuzun geçerli olduğunu doğrulayın. Bu siteye buradan gidin ve json'u yapıştırın. Json'un geçerli olup olmadığını size göstermelidir. Ayrıca Json ile uygun sınıfı oluşturmalıdır. Her değişkenden kaldırmayı kaldırdığınızdan { get; set; }
ve ayrıca [Serializable]
oluşturulan her sınıfın üstüne eklediğinizden emin olun .
Newtonsoft.Json:
Herhangi bir nedenle Newtonsoft.Json kullanılması gerekiyorsa, Unity'nin çatallı sürümünü buradan kontrol edin . Belirli bir özellik kullanılırsa çökme yaşayabileceğinizi unutmayın. Dikkatli ol.
Sorunuzu cevaplamak için :
Orijinal verileriniz
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Ekle {"Items":
içinde ön o zaman bir ekleme }
de sonunda onu.
Bunu yapmak için kod:
serviceData = "{\"Items\":" + serviceData + "}";
Şimdi sahipsin:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
To seri çoklu olarak php verileri diziler , artık yapabileceği
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
ilk veriniz
playerInstance[1]
ikinci veriniz
playerInstance[2]
üçüncü veriniz
veya sınıf içindeki veriler playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
playerInstance.Length
Erişmeden önce uzunluğu kontrol etmek için kullanabilirsiniz .
NOT: Kaldır { get; set; }
dan player
sınıfında. Eğer varsa { get; set; }
, işe yaramaz. Birlik en JsonUtility
etmez DEĞİL olarak tanımlanan sınıf üyeleri ile çalışmak özellikleri .
[
ve]
? Liste yapan da budur. Sadece onu kaldırmayı bırakın ve bir dizi veya liste olarak serisini kaldırın ve iyi olmasını beklerim. Lütfen denediğiniz kodu gönderin.