Как разобрать 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 {
}
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);
}