LibGDX:从json文件读取到ArrayList

14

我需要帮忙将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文章,但是我发现它不够清晰... 我不理解如何填充数组。请帮助我解决这个问题!


你所说的“一些问题”是指编译错误还是运行时错误?你能把它发出来吗? - NiziL
我已经编辑了我的帖子。据我所知,我在将JSON文件解析为数组时犯了错误。 - Pasha
3个回答

9
Tanmay Patil的答案是正确的,但你可以用以下方法简化循环:
ArrayList<Tile> board = json.fromJson(ArrayList.class, Tile.class, Gdx.files.internal("data/tiles.json"));

谢谢,这是非常有用的补充。 - Pasha
天啊,我刚刚把原来的JSON加载代码从10行减少到了1行。LibGDX真是太棒了。 - NielW
我刚看到这篇文章,与我的问题有些相关。除了读取json文件外,是否可以将json字符串(在原始问题中发布)写入文件?我还看到序列化的json文件中也打印了类信息,这是我不想要的。我的问题链接:http://gamedev.stackexchange.com/questions/125307/unable-to-remove-class-information-in-serialized-json-file-using-libgdx - user2582651
2
@user2582651 我回答了你的问题,希望能对你有所帮助。 - Nathan

9

您的json文件中存储了一个ArrayList<Tile>,但您试图将其读取为Tile

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

1) 您可以封装另一个类来简化序列化过程并包含瓷砖集合。

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));
}

希望这有所帮助。

请问您能否告诉我更多关于如何进行类型转换的信息?感谢您的回答! - Pasha
非常感谢,它有所帮助。 - Pasha
很高兴知道它有所帮助。 - Tanmay Patil

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

两年过去了,libgdx 有了一些变化,所以为了使其正常工作,现在我们需要添加 .readString()。在我弄清楚这一点之前,我一直卡住了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接