如何解析 JSON 嵌套数组

乔丹·旺

我在下面写了这段代码来读取 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章