Unity dodała JsonUtility do swojego API po aktualizacji 5.3.3 . Zapomnij o wszystkich bibliotekach innych firm, chyba że robisz coś bardziej skomplikowanego. JsonUtility jest szybsze niż inne biblioteki Json. Zaktualizuj do wersji Unity 5.3.3 lub nowszej, a następnie wypróbuj poniższe rozwiązanie.
JsonUtility
to lekki interfejs API. Obsługiwane są tylko proste typy. To nie nie obsługują kolekcji, takich jak hasła. Jedynym wyjątkiem jest List
. Obsługuje List
i List
szykuje!
Jeśli chcesz serializować Dictionary
lub zrobić coś innego niż po prostu serializować i deserializować proste typy danych, użyj interfejsu API innej firmy. W przeciwnym razie kontynuuj czytanie.
Przykładowa klasa do serializacji:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. JEDEN OBIEKT DANYCH (NON-ARRAY JSON)
Serializacja części A :
Serializuj do Json za pomocą public static string ToJson(object obj);
metody.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
string playerToJson = JsonUtility.ToJson(playerInstance);
Debug.Log(playerToJson);
Wyjście :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Serializacja części B :
Serializuj do Json z public static string ToJson(object obj, bool prettyPrint);
przeciążeniem metody. Zwykłe przekazanie true
do JsonUtility.ToJson
funkcji spowoduje sformatowanie danych. Porównaj dane wyjściowe poniżej z wynikami powyżej.
Player playerInstance = new Player();
playerInstance.playerId = "8484239823";
playerInstance.playerLoc = "Powai";
playerInstance.playerNick = "Random Nick";
string playerToJson = JsonUtility.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Wyjście :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Deserializacja część A :
Deserializacja json przy użyciu public static T FromJson(string json);
przeciążenia metody.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Deserializacja części B :
Deserializacja json przy użyciu public static object FromJson(string json, Type type);
przeciążenia metody.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Deserializacja część C :
Deserializacja json za pomocą public static void FromJsonOverwrite(string json, object objectToOverwrite);
metody. Gdy JsonUtility.FromJsonOverwrite
jest używany, nie zostanie utworzone żadne nowe wystąpienie tego obiektu, do którego deserializujesz. Po prostu ponownie wykorzysta przekazaną instancję i nadpisze jej wartości.
Jest to wydajne i powinno być używane, jeśli to możliwe.
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. WIELE DANYCH (ARRAY JSON)
Twoja Json zawiera wiele obiektów danych. Na przykład playerId
pojawił się więcej niż raz . Jedności JsonUtility
nie obsługuje tablicę, ponieważ jest jeszcze nowy, ale można użyć pomocnika klasy od tej osoby, aby uzyskać macierz pracuje z JsonUtility
.
Utwórz klasę o nazwie JsonHelper
. Skopiuj JsonHelper bezpośrednio od dołu.
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;
}
}
Serializacja tablicy 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";
string playerToJson = JsonHelper.ToJson(playerInstance, true);
Debug.Log(playerToJson);
Wyjście :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Deserializacja tablicy 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);
Wyjście :
Powai
Użytkownik2
Jeśli to jest tablica Json z serwera i nie utworzyłeś jej ręcznie :
Być może trzeba będzie dodać {"Items":
przed otrzymanym ciągiem, a następnie dodać }
na końcu.
Zrobiłem w tym celu prostą funkcję:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
wtedy możesz go użyć:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3. Deserializuj ciąg JSON bez klasy && De-serializacji Json z właściwościami numerycznymi
To jest Json, który zaczyna się od liczby lub właściwości numerycznych.
Na przykład:
{
"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's JsonUtility
tego nie obsługuje, ponieważ właściwość „15m” zaczyna się od liczby. Zmienna klasy nie może zaczynać się od liczby całkowitej.
Pobierz SimpleJSON.cs
z wiki Unity .
Aby uzyskać właściwość „15m” w USD:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Aby uzyskać własność ISK „15m”:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Aby uzyskać własność „15 m” NZD:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Pozostałe właściwości Json, które nie zaczynają się od cyfry, mogą być obsługiwane przez JsonUtility Unity.
4. ROZWIĄZYWANIE PROBLEMÓW JsonUtility:
Problemy podczas serializacji z JsonUtility.ToJson
?
Otrzymujesz pusty ciąg lub „ {}
” z JsonUtility.ToJson
?
. Upewnij się, że klasa nie jest tablicą. Jeśli tak, użyj powyższej klasy pomocniczej z JsonHelper.ToJson
zamiast JsonUtility.ToJson
.
B . Dodaj [Serializable]
na początku klasy, którą serializujesz.
C . Usuń właściwość z klasy. Na przykład w zmiennej public string playerId { get; set; }
remove { get; set; }
. Unity nie może tego serializować.
Problemy podczas deserializacji z JsonUtility.FromJson
?
. Jeśli otrzymasz Null
, upewnij się, że Json nie jest tablicą Json. Jeśli tak, użyj powyższej klasy pomocniczej z JsonHelper.FromJson
zamiast JsonUtility.FromJson
.
B . Jeśli otrzymasz NullReferenceException
podczas deserializacji, dodaj [Serializable]
do początku klasy.
C .Wszelkie inne problemy, sprawdź, czy plik json jest prawidłowy. Przejdź do tej witryny tutaj i wklej plik json. Powinien pokazać, czy plik json jest prawidłowy. Powinien również wygenerować odpowiednią klasę z Json. Po prostu pamiętaj, aby usunąć usuń { get; set; }
z każdej zmiennej, a także dodaj [Serializable]
na początku każdej wygenerowanej klasy.
Newtonsoft.Json:
Jeśli z jakiegoś powodu Newtonsoft.Json należy stosować wtedy sprawdzić wersję rozdwojony Jedności tutaj . Pamiętaj, że może wystąpić awaria, jeśli używana jest określona funkcja. Bądź ostrożny.
Aby odpowiedzieć na Twoje pytanie :
Twoje oryginalne dane to
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Dodaj {"Items":
do przodu o to następnie dodać }
na końcu tego.
Kod, aby to zrobić:
serviceData = "{\"Items\":" + serviceData + "}";
Teraz masz:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Do serializacji do wielu danych z PHP jako tablic , można teraz zrobić
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
to twoje pierwsze dane
playerInstance[1]
to twoje drugie dane
playerInstance[2]
to Twoje trzecie dane
lub danych wewnątrz klasy z playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
Możesz użyć, playerInstance.Length
aby sprawdzić długość przed uzyskaniem do niego dostępu.
UWAGA: Usuń { get; set; }
z player
zajęć. Jeśli tak { get; set; }
, to nie zadziała. Unity JsonUtility
ma NIE pracować z członków klasy, które są zdefiniowane jako właściwości .
[
i]
? To właśnie sprawia, że jest to lista. Po prostu przestań to usuwać i zdeserializuj jako tablicę lub listę, a spodziewałbym się, że wszystko będzie dobrze. Wpisz kod, który próbowałeś.