【问题标题】:Json NullPointerException when calling readValue调用 readValue 时出现 Json NullPointerException
【发布时间】:2014-07-12 02:16:47
【问题描述】:

我决定通过实现Json.Serializable 接口来编写自己的读写对象方法,因为我对 Json 的自动化对象写入方式(它省略了数组)感到不满意。我的写方法工作正常,但是由于某种原因,当我尝试读回值时,我得到了 NullPointerException,就好像我正在寻找一个名称不正确的值,我确定我没有这样做;写入和读取名称相同。这些是我的读写方法和Json输出(错误发生在第一次readValue()调用)。

@Override
public void write(Json json)
{
    json.writeObjectStart(this.getName());

    json.writeValue("Level", level);
    json.writeValue("Health", health);
    json.writeValue("Allegiance", alle);
    json.writeValue("Stats", stats);
    json.writeValue("Has Moved", hasMoved);
    json.writeValue("Position", new Point((int)this.getX(), (int)this.getY()));

    json.writeObjectEnd();
}

@Override
public void read(Json json, JsonValue jsonData)
{
    level = json.readValue("Level", Integer.class, jsonData);
    health = json.readValue("Health", Integer.class, jsonData);
    alle = json.readValue("Allegiance", Allegiance.class, jsonData);
    stats = json.readValue("Stats", int[].class, jsonData);
    hasMoved = json.readValue("Has Moved", Boolean.class, jsonData);

    Point p = json.readValue("Position", Point.class, jsonData);
    this.setPosition(p.x, p.y);
}
/////////////////////////////////////////////////////////////////////
player: {
    party: {}
},
state: state1,
map: {
    foes: {
        units: [
            {
                class: com.strongjoshuagames.reverseblade.game.units.UnitWolf,
                Wolf: {
                    Level: 5,
                    Health: 2,
                    Allegiance: FOE,
                    Stats: [ 2, 3, 3, 4, 3, 4, 3, 5 ],
                    "Has Moved": false,
                    Position: {
                        x: 320,
                        y: 320
                    }
                }
            }
        ]
    }
}

请注意,我已经从之前保存的同一个文件中读取了对象,因此该文件不应该成为问题。

【问题讨论】:

    标签: java json serialization libgdx


    【解决方案1】:

    我不是 100% 确定 JSON 库是如何工作的,但我相信既然您在写入函数中执行了 json.writeObjectStart(this.getName());,您必须像您编写的其他所有内容一样在读取函数中“反转”它。为了做到这一点,您需要获取 JsonValue 的第一个孩子并获取它的 Level、Health 等。我不确定 API,所以我不能给出确切的代码,但它会是这样的:

    level = json.readValue("Level", Integer.class, jsonData.child());
    

    可以这样想:我做了一个盒子,在里面放了一本字典。我不能只在盒子里查单词,我得先把字典拿出来。同样,您需要先获取您编写的对象,然后才能查找其字段。

    【讨论】:

    • 哇,就是这么简单……不过还是谢谢你的类比 :)
    • 这是否意味着我需要在每个关卡中调用child() 一个额外的时间来进入我正在编写的对象?就像说我正在编写的对象有一个也是Serializable 对象的字段,我是否必须调用jsonData.child().child() 才能读取该对象的值?
    • @StrongJoshua 基本上,是的。我认为也可能有一个 children() 或 getChild(name) 方法,它可以获取所有的孩子,而不仅仅是第一个,你会为更多的孩子使用。当你知道只有一个孩子存在时调用 child() 是可以的,但是对于像 Serializable 这样的字段我确定有一个 getChild(name) 方法或其他东西,请查看你用来查找它的 JSON 库的 API: )
    猜你喜欢
    • 2013-12-29
    • 2015-02-13
    • 2012-01-21
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    相关资源
    最近更新 更多