问题 LibGDX:从json文件读取到ArrayList


我需要帮助将json文件读取到ArrayList。

我有json文件:

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

我上课了:

public class Tile {

    public String name;
    public String symbol;

}

我有一个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"));
    }

}

我需要用json文件中的数据填充这个ArrayList,但是我遇到了一些问题。我想这一行

json.fromJson(Tile.class, Gdx.files.internal("data/tiles.json"));

是错的。

当我尝试运行它时

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: .
}

我已经阅读了关于json文件的libgdx文章,但我发现它不清楚......我不明白如何填充数组。请帮帮我吧!


3194
2017-11-22 14:21


起源

“一些问题”是什么意思?编译或运行时错误?你可以发布吗? - NiziL
我编辑了我的帖子。据我所知,我错误地将json文件解析为我的数组。 - Pasha


答案:


你的json文件有 ArrayList<Tile> 存储在其中,你试图把它读作一个 Tile

有两种方法可以纠正这个问题。

1)您可以将tile集合封装在另一个类中以简化序列化。

2)读为 ArrayList 并在以后转换类型。

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

希望这可以帮助。


8
2017-11-22 18:31



你能告诉我更多关于如何对此进行类型转换的信息吗?谢谢您的回答! - Pasha
我已经更新了答案。请检查一下。 - Tanmay Patil
非常感谢,它有所帮助 - Pasha
很高兴知道它有所帮助。 - Tanmay Patil


Tanmay Patil的答案是正确的,但你可以用以下方法保存循环:

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

7
2018-05-24 13:46



谢谢,这是非常有用的补充 - Pasha
哇靠。我只是将原来的JSON加载代码从10行减少到1. LibGDX非常可爱。 - NielW
我刚看到这篇文章,这与我的问题有些相关。而不是读取json文件,是否可以将json字符串(在原始问题中发布)写入文件?我看到类信息也打印在序列化的json文件中,这是我不想要的。我的问题链接: gamedev.stackexchange.com/questions/125307/... - user2582651
@ user2582651我回答了你的问题,希望它可以帮到你。 - Nathan


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

2年后,libgdx发生了一些变化,因此设法使其工作。现在我们要添加 .readString()。我被困住直到我弄明白了。


0
2018-05-16 00:13