Как получить доступ к массиву в json?

Используя gson, как бы вы получили доступ к значениям в массиве LeagueTable в этом json?

Вот структура json, которая хранится в виде строки с именем «dataRead».

{
   "data":{
      "fixtures":[
         {
         }
      ],
    "leagueTable":[
         {
         }
      ]
   }
}

Мой код gson выглядит так, а строка печати предназначена для доступа к объекту в массиве.

Data data = new Gson().fromJson(dataRead, Data.class);
System.out.println(data.leagueTable[0].team);

Мой класс данных выглядит так и соответствует тому, что в json

public class Data {
    LeagueTable[] leagueTable;

    public Data(LeagueTable[] leagueTable) {
        this.leagueTable = leagueTable;
    }

    public static class LeagueTable {
        String team;
        int played, gamesWon, gamesDraw, gameLost, goalsFor, goalsAgainst, goalsDifference, points;

        public LeagueTable(String team, int played, int gamesWon, int gamesDraw, int gameLost, int goalsFor,
                int goalsAgainst, int goalsDifference, int points) {
            this.team = team;
            this.played = played;
            this.gamesWon = gamesWon;
            this.gamesDraw = gamesDraw;
            this.gameLost = gameLost;
            this.goalsFor = goalsFor;
            this.goalsAgainst = goalsAgainst;
            this.goalsDifference = goalsDifference;
            this.points = points;
        }

    }
}

Я ожидаю строку первой команды в массиве LeagueTable, но получаю следующее сообщение:

Exception in thread "main" java.lang.NullPointerException

Или stackoverflow.com/questions/12004338/…

Savior 03.04.2019 21:56

Где трассировка стека говорит, что происходит NPE, если вы разделите строку System.out.println на три отдельные строки? Например. 1 строка data, 2 строка .leagueTable[0], 3 строка .team? Это скажет вам, какая часть объекта не десериализуется.

spork 03.04.2019 22:01

@spork Я поместил данные в строку печати, и это дало мне: dawfl.Data@5056dfcb (dawfl — мой пакет) System.out.println(data.leagueTable[0]); дает мне NPE

jmcveigh15 03.04.2019 22:15

@ jmcveigh15 Вам может понадобиться конструктор по умолчанию в LeagueTable. Не могли бы вы добавить один и посмотреть, очистит ли это NPE?

spork 03.04.2019 22:33
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша структура данных, представленная Data, не соответствует вашей структуре json. Поэтому Gson только создает новый экземпляр типа Data, но не заполняет его значениями участников.

Попробуйте эту реализацию:

public class MyObject {

    private Data data;

    public static class Data {

       private FixturesStrutue[] fixtures;
       private LeagueTable[] leagueTable;

       public static class LeagueTable {
           String team;
           int played, gamesWon, gamesDraw, gameLost, goalsFor, goalsAgainst, 
                   goalsDifference, points;

       }

       public static class FixturesStrutue {
           String member1;
           int member2;

       }
   }
}

Теперь используйте Gson:

Data data = new Gson().fromJson(dataRead, MyObject.class);
System.out.println(data.leagueTable[0].team);

Последняя строка (data.leagueTable[0].team) по-прежнему будет выдавать NPE, потому что у вас нет элементов в массиве leagueTable в json. Добавьте в него хотя бы один элемент и все будет в порядке.

Gson внедрит все свойства из json в соответствующие члены класса по имени. Если вы хотите, чтобы член и свойство имели разные имена, прочитайте о СериализованноеИмя.

Другие вопросы по теме

Не удалось разобрать массив json с метеостанции
Сопоставление данных из массива в дочернем компоненте и родительском компоненте
Как реализовать функцию, возвращающую «перечисление» объектов?
Переменная TypeScript не определена внутри array.forEach()
Как проверить значения выше и ниже определенных заранее установленных пределов
Как я могу уменьшить приведенный ниже код? Я не хочу ставить цикл for и хочу принимать ввод в виде списка целых чисел
Как я могу инициализировать свой объект Matrix, как я сделал бы с многомерным массивом в C#?
Получив строку, переместите первую букву каждого слова в конец каждого слова, затем добавьте «ay» в конец каждого слова и верните новую строку — JavaScript
Как я могу расширить список, чтобы позаботиться о таких элементах, как «38359*0», которые я хочу представить как 38359 элементов, равных 0?
Есть ли в Python простой способ соединить соседние элементы в массиве?