Json NullPointerException при вызове readValue

1

Я решил написать свои собственные методы чтения и записи объектов, реализовав интерфейс 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
                    }
                }
            }
        ]
    }
}

Обратите внимание, что я читал объекты из того же файла, которые ранее были сохранены, поэтому файл не должен быть проблемой.

Теги:
libgdx
serialization

1 ответ

1
Лучший ответ

Я не уверен на 100%, как работает библиотека JSON, но я считаю, что, поскольку вы делаете json.writeObjectStart(this.getName()); в вашей функции записи вы должны "отменить" это в своей функции чтения, как и все остальное, что вы написали. Для этого вам нужно получить первого ребенка JsonValue и получить его "Уровень", "Здоровье" и т.д. Я не уверен в API, поэтому я не могу дать точный код, но это будет примерно так:

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

Подумайте об этом так: я делаю коробку и помещаю в нее словарь. Я не могу просто искать слова в поле, я должен сначала вывести словарь. Аналогично, вам нужно сначала получить объект, который вы написали, прежде чем вы сможете искать его поля.

  • 1
    Вау, это было так просто ... Спасибо за аналогию, хотя :)
  • 0
    Означает ли это, что мне нужно вызывать child() каждый раз, когда я добавляю объект, который пишу? Например, если у объекта, который я пишу, есть поле, которое также является Serializable объектом, нужно ли мне вызывать jsonData.child().child() чтобы прочитать значения этого объекта?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню