我在下面写了这段代码来读取 JSON 并保存在 PostgreSQL 中,但是它在嵌套时不起作用,只添加了最后两条记录。如何循环嵌套数组 HD。在这种情况下有 2 个嵌套数组 HD。我怎样才能使这项工作?我应该循环高清阵列还是我在这里做错了什么?
{
"result": {
"HD": [
{
"ADDR": "2218",
"CAT": "s",
"NAME": "Last"
}
],
"HD": [
{
"ADDR": "2219",
"CAT": "w",
"NAME": "Last"
},
"HD":
{
"ADDR": "2220",
"CAT": "m",
"NAME": "Last"
}
]
}
我的域类
@AllArgsConstructor
@Data
@Entity
@Table(name ="receive", schema = "public")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Response {
@Id
@JsonProperty("ADDR")
@Column(name = "addr")
private String ADDR;
@JsonProperty("CAT")
@Column(name = "cat")
private String CAT;
@JsonProperty("NAME")
@Column(name = "name")
private String NAME;
}
@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
public class Result {
@JsonProperty("HD")
List<Response> HD = new ArrayList<>();
}
@Getter
public class AddressArray {
Result result;
}
这是我的主要课程;我很确定我在这里遗漏了一些东西
public class ReceiveApplication {
public static void main(String[] args) {
SpringApplication.run(ReceiveApplication.class, args);
}
@Bean
CommandLineRunner runner(ResponseService responseService) {
return args -> {
ObjectMapper mapper = new ObjectMapper();
TypeReference<AddressArray> typeReference1 = new TypeReference<AddressArray>() {
};
InputStream inputStream = TypeReference.class.getResourceAsStream("/json/response.json");
try {
AddressArray addressArray = mapper.readValue(inputStream, typeReference1);
List<Response> responses = addressArray.getResult().getHD();
responseService.save(responses);
System.out.println(responses);
System.out.println("Data saved in table");
} catch (IOException e) {
System.out.println("not saved " + e.getMessage());
}
};
}
}
问题出在 JSON 中,那里有两个 HD 条目。首先,这个:
"HD": [
{
"ADDR": "2218", ...
}
]
然后是第二个,在同一级别:
"HD": [
{
"ADDR": "2219", ...
},
"HD":
{
"ADDR": "2220", ...
}
]
想象一下,这被读取为键值映射,其中“HD”是键。在解析过程中,第一个条目存储在映射中,但它被具有相同键的第二个条目覆盖。如此有效地,第一个条目丢失并且没有被存储。
您没有提到输入的来源,但如果您能够修改它,您应该简单地将所有 HD 值放在一个数组中:
"HD": [
{
"ADDR": "2218", ...
},
{
"ADDR": "2219", ...
},
{
"ADDR": "2220", ...
}
]
更新:
如果无法更改输入,您可以按照此处所述以更通用的方式读取数据。
并回答您的另一个问题,要读取名为 HD、HD1、HD2 等的属性,您只需在响应类中放置多个成员:
List<Response> HD = new ArrayList<>();
List<Response> HD1 = new ArrayList<>();
List<Response> HD2 = new ArrayList<>();
你得到了图片;-)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句