Как разобрать JSON в модель ActiveJDBC?

Я использую ActiveJDBC для домашнего проекта. Кажется, я не могу найти способ преобразовать массив JSON в массив List или Java. Код ниже берет массив JSON и создает список, НО модель не заполняется. Это означает, что number.get("winning_numbers") равно null, когда я ожидаю, что оно будет содержать значение.

Поскольку ошибки нет, я не могу найти способ заполнить эту модель с конечной целью сохранить ее в базе данных. Любые идеи?

Я знаю, что ActiveJDBC требует инструментовки, и я убедился, что это происходит, поэтому я сомневаюсь, что проблема в этом.

# schema
create table draws (
  draw_date TIMESTAMP not null,
  winning_numbers varchar(20) not null,
  multiplier int not null,
  primary key (draw_date)
)

Ошибочная строка находится во втором операторе if с отступом. Это все еще прототип кода, поэтому приношу свои извинения за то, что я еще не отформатировал его для улучшения кода.

# where the problem resides
public class PowerballLotteryService {
    private static final Logger log = LoggerFactory.getLogger(PowerballLotteryService.class);
    private static String LOTTO_URL = "http://data.ny.gov/resource/d6yy-54nr.json";

    public static List<LottoNumbers> getLatest() {
        List<LottoNumbers> latestNumbers = Lists.newArrayList();

        // rest client
        String result = null;
        List<Draw> numbersList = null;

        try {
            Client client = Client.create();
            WebResource webResource2 = client.resource(LOTTO_URL);
            ClientResponse response2 = webResource2.accept("application/json").get(ClientResponse.class);
            if (response2.getStatus() != 200) {
                throw new RuntimeException("Failed : HTTP error code : " + response2.getStatus());
            }

            result = response2.getEntity(String.class);

            if (result != null) {
                Gson gson = new GsonBuilder().create();
                numbersList = new Gson().fromJson(result, new TypeToken<List<Draw>>(){}.getType());

                if (numbersList != null) {
                    for(Draw number : numbersList) {
                        // This is always null for some reason: number.get("winning_numbers")
                        String winningNumber = number.get("winning_numbers").toString();
                        if (winningNumber != null) {
                            number.saveIt();
                        }
                    }
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return latestNumbers;
    }
}

ИЗМЕНИТЬ Модель - простая, как примеры в документации ActiveJDBC.

public class Draw extends Model {
}

person Jose Leon    schedule 05.04.2016    source источник
comment
где вы заполняете модель?   -  person ipolevoy    schedule 05.04.2016
comment
Кроме того, вы уверены, что ваша модель имеет соответствующие методы свойств? Я не знаком с Gson, но предполагаю, что он использует отражение для методов fromJson: google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/com/, java.lang .Класс)   -  person ipolevoy    schedule 05.04.2016
comment
Я добавил модель в пост, но это просто. Я ожидаю, что модель будет заполнена этой строкой numbersList = new Gson().fromJson(result, new TypeToken<List<Draw>>(){}.getType());   -  person Jose Leon    schedule 05.04.2016


Ответы (1)


В вашей модели нет методов свойств, поэтому Gson не устанавливает никаких значений (я предполагаю, что он использует стандартные соглашения об именах свойств JavaBeans). Что-то вроде этого должно работать:

public class Draw extends Model {
   public void setWinningNumbers(String n){ set("winning_numbers", n);}
}

Из-за того, как работает Gson, вы можете поэкспериментировать с именами методов: set_winning_numbers или setWinning_Numbers или setWinning_numbers - я не уверен. Однако в настоящее время у вас нет методов для сопоставления с Gson.

Альтернативное решение: получить данные на карты:

List<Map> numbersList = new Gson().fromJson(result, new TypeToken<List<Map>>(){}.getType());

после этого:

List<Draw> draws = new ArrayList<>();
for(Map m: numbersList){
    Draw d = new Draw();
    d.fromMap(m);
    draws.add(d);
}
person ipolevoy    schedule 05.04.2016
comment
Пока мне понравилось и я попробовал первое предложение, я не смог заставить его работать. Но использование метода Map работает хорошо. Спасибо! - person Jose Leon; 05.04.2016
comment
круто, если вы реализуете конструктор, который принимает карту, вы можете сохранить строки кода: draws.add(new Draw(map)). - person ipolevoy; 06.04.2016