Unity a ajouté JsonUtility à son API après la mise à jour 5.3.3 . Oubliez toutes les bibliothèques tierces à moins que vous ne fassiez quelque chose de plus compliqué. JsonUtility est plus rapide que les autres bibliothèques Json. Mettez à jour vers la version Unity 5.3.3 ou supérieure, puis essayez la solution ci-dessous.
JsonUtility
est une API légère. Seuls les types simples sont pris en charge. Il ne prend pas en charge les collections telles que Dictionary. Une exception est List
. Il prend en charge List
et List
tableau!
Si vous devez sérialiser un Dictionary
ou faire autre chose que simplement sérialiser et désérialiser des types de données simples, utilisez une API tierce. Sinon, continuez à lire.
Exemple de classe à sérialiser:
[Serializable]
public class Player
{
public string playerId;
public string playerLoc;
public string playerNick;
}
1. UN OBJET DE DONNÉES (JSON NON-ARRAY)
Sérialisation de la partie A :
Sérialisez vers Json avec la public static string ToJson(object obj);
méthode.
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);
Sortie :
{"playerId":"8484239823","playerLoc":"Powai","playerNick":"Random Nick"}
Sérialisation de la partie B :
Sérialisez vers Json avec la public static string ToJson(object obj, bool prettyPrint);
surcharge de méthode. Le simple fait de passer true
à la JsonUtility.ToJson
fonction formatera les données. Comparez la sortie ci-dessous à la sortie ci-dessus.
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);
Sortie :
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
}
Désérialisation de la partie A :
Désérialisez json avec la public static T FromJson(string json);
surcharge de méthode.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = JsonUtility.FromJson<Player>(jsonString);
Debug.Log(player.playerLoc);
Désérialisation de la partie B :
Désérialisez json avec la public static object FromJson(string json, Type type);
surcharge de méthode.
string jsonString = "{\"playerId\":\"8484239823\",\"playerLoc\":\"Powai\",\"playerNick\":\"Random Nick\"}";
Player player = (Player)JsonUtility.FromJson(jsonString, typeof(Player));
Debug.Log(player.playerLoc);
Désérialisation de la partie C :
Désérialisez json avec la public static void FromJsonOverwrite(string json, object objectToOverwrite);
méthode. Quand JsonUtility.FromJsonOverwrite
est utilisé, aucune nouvelle instance de cet objet que vous désérialisez ne sera créée. Il réutilisera simplement l'instance que vous transmettez et écrasera ses valeurs.
Ceci est efficace et doit être utilisé si possible.
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. DONNÉES MULTIPLES (ARRAY JSON)
Votre Json contient plusieurs objets de données. Par exemple playerId
est apparu plus d' une fois . Unity JsonUtility
ne prend pas en charge le tableau car il est encore nouveau, mais vous pouvez utiliser une classe d' assistance de cette personne pour faire fonctionner le tableauJsonUtility
.
Créez une classe appelée JsonHelper
. Copiez le JsonHelper directement à partir du dessous.
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;
}
}
Sérialisation de la baie 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);
Sortie :
{
"Items": [
{
"playerId": "8484239823",
"playerLoc": "Powai",
"playerNick": "Random Nick"
},
{
"playerId": "512343283",
"playerLoc": "User2",
"playerNick": "Rand Nick 2"
}
]
}
Désérialisation de 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);
Sortie :
Powai
Utilisateur2
S'il s'agit d'un tableau Json du serveur et que vous ne l'avez pas créé à la main :
Vous devrez peut-être ajouter {"Items":
devant la chaîne reçue, puis ajouter }
à la fin de celle-ci.
J'ai fait une fonction simple pour cela:
string fixJson(string value)
{
value = "{\"Items\":" + value + "}";
return value;
}
alors vous pouvez l'utiliser:
string jsonString = fixJson(yourJsonFromServer);
Player[] player = JsonHelper.FromJson<Player>(jsonString);
3. désérialiser la chaîne json sans classe && désérialiser Json avec des propriétés numériques
Il s'agit d'un Json qui commence par un nombre ou des propriétés numériques.
Par exemple:
{
"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
ne prend pas en charge cela car la propriété "15m" commence par un nombre. Une variable de classe ne peut pas commencer par un entier.
Téléchargez à SimpleJSON.cs
partir du wiki d'Unity .
Pour obtenir la propriété "15m" de USD:
var N = JSON.Parse(yourJsonString);
string price = N["USD"]["15m"].Value;
Debug.Log(price);
Pour obtenir la propriété "15m" d'ISK:
var N = JSON.Parse(yourJsonString);
string price = N["ISK"]["15m"].Value;
Debug.Log(price);
Pour obtenir la propriété "15m" de NZD:
var N = JSON.Parse(yourJsonString);
string price = N["NZD"]["15m"].Value;
Debug.Log(price);
Le reste des propriétés Json qui ne commencent pas par un chiffre numérique peuvent être gérés par JsonUtility d'Unity.
4.DÉPANNAGE JsonUtility:
Problèmes lors de la sérialisation avec JsonUtility.ToJson
?
Obtenir une chaîne vide ou " {}
" avec JsonUtility.ToJson
?
A . Assurez-vous que la classe n'est pas un tableau. Si tel est le cas, utilisez la classe d'assistance ci-dessus avec JsonHelper.ToJson
au lieu de JsonUtility.ToJson
.
B . Ajoutez [Serializable]
en haut de la classe que vous sérialisez.
C . Supprimez la propriété de la classe. Par exemple, dans la variable, public string playerId { get; set; }
supprimez { get; set; }
. Unity ne peut pas sérialiser cela.
Problèmes lors de la désérialisation avec JsonUtility.FromJson
?
A . Si vous obtenez Null
, assurez-vous que Json n'est pas un tableau Json. Si tel est le cas, utilisez la classe d'assistance ci-dessus avec JsonHelper.FromJson
au lieu de JsonUtility.FromJson
.
B . Si vous obtenez NullReferenceException
lors de la désérialisation, ajoutez [Serializable]
en haut de la classe.
C. Pour tout autre problème, vérifiez que votre json est valide. Allez sur ce site ici et collez le fichier json. Il devrait vous montrer si le json est valide. Il devrait également générer la classe appropriée avec le Json. Assurez-vous simplement de supprimer remove { get; set; }
de chaque variable et d'ajouter également [Serializable]
en haut de chaque classe générée.
Newtonsoft.Json:
Si pour une raison quelconque Newtonsoft.Json doit être utilisé, consultez la version fourchue pour Unity ici . Notez que vous pouvez rencontrer des plantages si certaines fonctionnalités sont utilisées. Faites attention.
Pour répondre à votre question :
Vos données d'origine sont
[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]
Ajouter {"Items":
à l' avant de celui - ci , puis ajouter }
à la fin de celui - ci.
Code pour ce faire:
serviceData = "{\"Items\":" + serviceData + "}";
Maintenant vous avez:
{"Items":[{"playerId":"1","playerLoc":"Powai"},{"playerId":"2","playerLoc":"Andheri"},{"playerId":"3","playerLoc":"Churchgate"}]}
Pour sérialiser les multiples données de php sous forme de tableaux , vous pouvez maintenant faire
public player[] playerInstance;
playerInstance = JsonHelper.FromJson<player>(serviceData);
playerInstance[0]
est vos premières données
playerInstance[1]
est votre deuxième donnée
playerInstance[2]
est votre troisième donnée
ou des données à l' intérieur de la classe playerInstance[0].playerLoc
, playerInstance[1].playerLoc
, playerInstance[2].playerLoc
......
Vous pouvez utiliser playerInstance.Length
pour vérifier la longueur avant d'y accéder.
REMARQUE: retirez { get; set; }
de la player
classe. Si c'est le cas { get; set; }
, cela ne fonctionnera pas. Unity JsonUtility
ne fonctionne PAS avec les membres de classe définis comme propriétés .
[
et]
? C'est ce qui en fait une liste. Arrêtez simplement de supprimer cela et désérialisez-le sous forme de tableau ou de liste et je m'attendrais à ce que tout se passe bien. Veuillez publier le code que vous avez essayé.