如何将 JSON 解析为 ActiveJDBC 模型?
How to parse JSON into an ActiveJDBC Model?
我正在为一个宠物项目使用 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 {
}
你的模型没有 属性 方法,所以 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);
}
我正在为一个宠物项目使用 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 {
}
你的模型没有 属性 方法,所以 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);
}