Я решил написать свои собственные методы чтения и записи объектов, реализовав интерфейс 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
}
}
}
]
}
}
Обратите внимание, что я читал объекты из того же файла, которые ранее были сохранены, поэтому файл не должен быть проблемой.
Я не уверен на 100%, как работает библиотека JSON, но я считаю, что, поскольку вы делаете json.writeObjectStart(this.getName());
в вашей функции записи вы должны "отменить" это в своей функции чтения, как и все остальное, что вы написали. Для этого вам нужно получить первого ребенка JsonValue и получить его "Уровень", "Здоровье" и т.д. Я не уверен в API, поэтому я не могу дать точный код, но это будет примерно так:
level = json.readValue("Level", Integer.class, jsonData.child());
Подумайте об этом так: я делаю коробку и помещаю в нее словарь. Я не могу просто искать слова в поле, я должен сначала вывести словарь. Аналогично, вам нужно сначала получить объект, который вы написали, прежде чем вы сможете искать его поля.
child()
каждый раз, когда я добавляю объект, который пишу? Например, если у объекта, который я пишу, есть поле, которое также являетсяSerializable
объектом, нужно ли мне вызыватьjsonData.child().child()
чтобы прочитать значения этого объекта?