2014-11-22 5 views
10

Potrzebuję pomocy w czytaniu pliku json do ArrayList.LibGDX: Czytanie z pliku json do ArrayList

Mam json plik:

[ 
    { 
     "name": "Wall", 
     "symbol": "#",  
    }, 
    { 
     "name": "Floor", 
     "symbol": ".", 
    } 
] 

Mam klasy:

public class Tile { 

    public String name; 
    public String symbol; 

} 

I mam innej klasy z ArrayList:

public class Data { 

    public static ArrayList<Tile> tilesData; 

    public static void loadData() { 
     tilesData = new ArrayList<Tile>(); 
     Json json = new Json(); 
     json.fromJson(Tile.class, Gdx.files.internal("data/tiles.json")); 
    } 

} 

muszę wypełnić ten ArrayList z dane z pliku json, ale mam pewne problemy. Domyślam się, że linia jest uszkodzona.

Kiedy próbuję uruchomić to jest

Exception in thread "LWJGL Application" com.badlogic.gdx.utils.SerializationException: Error reading file: data/tiles.json 

Caused by: com.badlogic.gdx.utils.SerializationException: Unable to convert value to required type: [ 
{ 
    name: Wall, 
    symbol: # 
}, 
{ 
    name: Floor, 
    symbol: . 
} 

Czytałem artykuł o plikach libgdx json, ale uważam, że to jasne ... Nie rozumiem, jak wypełnić tablicę. Proszę, pomóż mi w tej sprawie!

+0

Co masz na myśli przez „pewne problemy”? Błędy kompilacji lub środowiska wykonawczego? Czy możesz to opublikować? – NiziL

+0

Edytowałem mój wpis. Jak wiem, popełniłem błąd podczas analizowania pliku json do mojej tablicy. – Pasha

Odpowiedz

7

Twój plik json ma zapisany w nim plik ArrayList<Tile> i próbujesz go odczytać jako Tile.

Istnieją dwa sposoby na rozwiązanie tego problemu.

1) Możesz zamknąć zbiór płytek w innej klasie, aby uprościć serializację.

2) Przeczytaj jako ArrayList i przekonwertuj typ później.

ArrayList<JsonValue> list = json.fromJson(ArrayList.class, 
              Gdx.files.internal("data/tiles.json")); 
for (JsonValue v : list) { 
    tilesData.add(json.readValue(Tile.class, v)); 
} 

Mam nadzieję, że to pomoże.

+0

Czy możesz mi powiedzieć więcej o tym, jak to napisać? Dziękuję za Twoją odpowiedź! – Pasha

+0

Zaktualizowałem odpowiedź. Proszę sprawdź to. –

+0

Dziękuję bardzo, pomogło – Pasha

7

Odpowiedź z Tanmay Patil ma rację, ale można zapisać pętlę z:

ArrayList<Tile> board = json.fromJson(ArrayList.class, Tile.class, Gdx.files.internal("data/tiles.json")); 
+0

Dziękuję, jest bardzo przydatny dodatek – Pasha

+0

Holy crap. Właśnie zmniejszyłem mój oryginalny kod ładujący JSON z 10 linii w dół do 1. LibGDX jest całkiem słodki. – NielW

+0

Właśnie natknąłem się na ten post, który jest nieco związany z moimi pytaniami. Zamiast czytać plik json, czy możliwe jest zapisanie w pliku ciągu jsonów (opublikowanego w oryginalnym pytaniu)? Widzę informacje o klasie również wydrukowane w zserializowanym pliku json, czego nie chcę. Link do mojego pytania: http://gamedev.stackexchange.com/questions/125307/unable-to-remove-class-information-in-serialized-json-file-using-libgdx – user2582651