【问题标题】:LibGDX: Reading from json file to ArrayListLibGDX:从 json 文件读取到 ArrayList
【发布时间】:2015-01-20 14:31:39
【问题描述】:

我需要帮助将 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 文章,但我发现它不清楚......我不明白如何填充数组。请帮我处理这个案子!

【问题讨论】:

  • “一些问题”是什么意思?编译或运行时错误?可以发一下吗?
  • 我已经编辑了我的帖子。据我所知,我在将 json 文件解析到我的数组时出错了。

标签: java json libgdx


【解决方案1】:

您的 json 文件中存储有 ArrayList&lt;Tile&gt;,您正尝试将其读取为 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));
}

希望这会有所帮助。

【讨论】:

  • 你能告诉我更多关于如何打字吗?谢谢你的回答!
  • 非常感谢,帮了大忙
  • 很高兴知道它有帮助。
【解决方案2】:

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

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

【讨论】:

  • 谢谢,非常有用的补充
  • 天哪。我刚刚将原始 JSON 加载代码从 10 行减少到 1 行。LibGDX 非常棒。
  • 我刚看到这篇文章,这与我的问题有些相关。除了读取 json 文件,是否可以将 json 字符串(在原始问题中发布)写入文件?我看到类信息也打印在序列化的 json 文件中,这是我不想要的。我的问题链接:gamedev.stackexchange.com/questions/125307/…
  • @user2582651 我回答了你的问题,希望对你有帮助。
【解决方案3】:
ArrayList<Tile> board = json.fromJson(ArrayList.class, Tile.class,
    Gdx.files.internal("data/tiles.json").readString());

2 年了,libgdx 发生了一些变化,所以设法让它工作。现在我们必须添加.readString()。在我弄清楚这一点之前,我一直被困住。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-20
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多