web-dev-qa-db-fra.com

Unity C # JsonUtility ne sérialise pas une liste

J'ai quelques données dont j'ai besoin pour sérialiser/désérialiser, mais JsonUtility ne fait tout simplement pas ce qu'il est censé faire. Voici les objets avec lesquels je travaille:

public class SpriteData {
    public string Sprite_name;
    public Vector2 Sprite_size;
    public List<Vector2> subimage;
}

public class SpriteDataCollection
{
    public SpriteData[] sprites;
}

Si je crée un SpriteDataCollection et tente de le sérialiser avec JsonUtility, j'obtiens simplement un objet vide {}. Voici comment il est construit:

            SpriteData data = new SpriteData();
            data.Sprite_name = "idle";
            data.Sprite_size = new Vector2(64.0f, 64.0f);
            data.subimage = new List<Vector2> { new Vector2(0.0f, 0.0f) };

            SpriteDataCollection col = new SpriteDataCollection();
            col.sprites = new SpriteData[] { data };

            Debug.Log(JsonUtility.ToJson(col));

Le journal de débogage affiche uniquement "{}". Pourquoi ne sérialise-t-il rien? Je l'ai testé et la sérialisation d'un seul SpriteData fait exactement ce qu'il est censé faire, mais cela ne fonctionnera pas dans SpriteDataCollection.

11
Matthew Fournier

Il y a 4 raisons connues pour lesquelles vous pouvez obtenir un Json vide dans Unity.

1 . Non compris [Serializable]. Vous obtenez un json vide si vous ne l'incluez pas.

2 . Utilisation de la propriété (get/set) comme variable. JsonUtility ne prend pas en charge cela.

3 . Tentative de sérialisation d'une collection autre que List.

4 . Votre json est multi-tableau que JsonUtility ne supporte pas et a besoin d'un wrapper pour fonctionner.

Le problème ressemble à # 1 . Tu es absent [Serializable] sur les classes. Vous devez ajouter using System; pour l'utiliser.

[Serializable]
public class SpriteData {
    public string Sprite_name;
    public Vector2 Sprite_size;
    public List<Vector2> subimage;
}

et

[Serializable]
public class SpriteDataCollection
{
    public SpriteData[] sprites;
}

5 . Comme l'exemple donné ci-dessus dans la classe SpriteData, la variable doit être une variable publique. S'il s'agit d'une variable privée, ajoutez [SerializeField] en haut.

[Serializable]
public class SpriteDataCollection
{
    [SerializeField]
    private SpriteData[] sprites;
}

S'il ne fonctionne toujours pas, votre json n'est probablement pas valide. Lisez "4.TROUBLESHOOTING JsonUtility" dans la réponse du "Sérialiser et désérialiser Json et Json Array dans Unity" . Cela devrait vous expliquer comment résoudre ce problème.

20
Programmer