Page 1 sur 1

[RESOLU]Deserializer un JSON

Publié : 02 Déc 2019 20:20
par Nrgumn
Bonjour à tous,

J'essais dans mon application de faire un classement des joueurs. Je récupère de ma base de données un JSON qui a cette tête là => [{"userName":"Nrgumn","userScore":"7"},{"userName":"Remy","userScore":"8"}]

Dans cet exemple je récupère le pseudo et le score de 2 joueurs.

Est-ce que quelqu'un pourrait m'expliquer comment je peux faire pour pouvoir récupérer les informations de ces 2 joueurs ?

Merci beaucoup :)
Rémy

Re: Deserialize un JSON

Publié : 02 Déc 2019 20:43
par boubouk50
Tu as de la chance, j'ai vu ça Jeudi dernier. Pour les explications par contre, je ne suis pas au point.
https://stackoverflow.com/questions/370 ... listobject
Tu ne peux pas directement "deserializer" un tableau. Il te faut donc tricher en deux étapes avec 2 wrappers.
Tu vas créer une classe qui possède les champs de ce que tu dois récupérer et une autre qui est une liste ou un tableau de cette classe.
Il te faut modifier ta string pour pouvoir la "déserializer" comme une variable unique.
[... tu vois, je sais pas l'expliquer]
Premièrement, modifier ta string

Code : Tout sélectionner

[{"userName":"Nrgumn","userScore":"7"},{"userName":"Remy","userScore":"8"}]
pour que ce soit l'affectation d'une seule variable et avoir un résultat comme suit:

Code : Tout sélectionner

newJsonString = {"players":[{"userName":"Nrgumn","userScore":"7"},{"userName":"Remy","userScore":"8"}]}
Tu vois maintenant tu peux "déserializer" dans players.
Il faut donc définir players:

Code : Tout sélectionner

[Serializable]
public class Players
{
    public Player[] players;
}
players est un tableau de player, ce que tu veux récupérer, il te faut donc la définir comme tu le ferais pour une variable unique

Code : Tout sélectionner

[Serializable]
public class Player
{
    public string userName;
    public int userScore;
}
Voilà, maintenant tu as une variable players qui contient des player.
Tu peux donc "déserializer":

Code : Tout sélectionner

Players myPlayers = JsonUtility.FromJson<Players>(newJsonString );
et tu peux ensuite accéder à chaque player depuis le tableau:

Code : Tout sélectionner

myPlayers.players[index]
Car myPlayers contient une variable players qui est un tableau de player.

J'espère que je suis suffisamment pas trop obscur pour que tu aies compris :D

Re: Deserialize un JSON

Publié : 02 Déc 2019 21:10
par Nrgumn
Merci beaucoup, c'est très détaillé.
J'essaye ça dès demain, je te dirai si ça à fonctionné.
Encore merci.

Re: Deserialize un JSON

Publié : 02 Déc 2019 22:42
par Nrgumn
Bon je ne m'en sort pas.

J'ai un problème à la compilation sur la ligne

Code : Tout sélectionner

Players myPlayers = JsonUtility.FromJson<Player>(newJsonString );
Voici l'erreur :
CS0029 Impossible de convertir implicitement le type 'Player' en 'Players'

Voici les 2 classes que j'ai créées

Code : Tout sélectionner

[Serializable]
public class Players
{
    public Player[] players;
}

[Serializable]
public class Player
{
    public string userName;
    public int userScore;
}
Voici ce que j'ai fait pour travailler le JSON que je reçois de mon script PHP

Code : Tout sélectionner

newJsonString = "{" + '\u0022' + "players" + '\u0022' + ":" + '\u0022' + jsonString + '\u0022' + "}";
Ce qui me donne la chaîne de caractères suivante :
{"players":"[{"userName":"Nrgumn","userScore":"7"},{"userName":"R\u00e9my","userScore":"8"}]"}


Une idée ?

Re: Deserialize un JSON

Publié : 03 Déc 2019 12:22
par Alesk
Salut,

Ton Array est entre guillemets

{"players":"[{"userName":"Nrgumn","userScore":"7"},{"userName":"R\u00e9my","userScore":"8"}]"}

il ne faut pas ;)

Re: Deserialize un JSON

Publié : 03 Déc 2019 12:36
par Max
Salut,

en complément du commentaire d'Alesk,
Nrgumn a écrit :
02 Déc 2019 22:42
J'ai un problème à la compilation sur la ligne

Code : Tout sélectionner

Players myPlayers = JsonUtility.FromJson<Player>(newJsonString );
Voici l'erreur :
CS0029 Impossible de convertir implicitement le type 'Player' en 'Players'
ce n'est pas

Code : Tout sélectionner

Players myPlayers = JsonUtility.FromJson<Player>(newJsonString );
mais plutôt

Code : Tout sélectionner

Players myPlayers = JsonUtility.FromJson<Players>(newJsonString );
le type de l'objet attendu doit correspondre au type demandé.

Re: Deserialize un JSON

Publié : 03 Déc 2019 14:15
par boubouk50
Je plaide coupable pour les 2 coquilles :mrgreen:

(je les ai rectifiées pour d'éventuels autres membres en souffrance)

Re: Deserialize un JSON

Publié : 03 Déc 2019 14:58
par Nrgumn
Ça fonctionne nickel.
Merci à tous, super travail d'équipe :super: