【问题标题】:How to loop trough nested JSON and get value using Java, SpringBoot如何遍历嵌套的 JSON 并使用 Java、Spring Boot 获取值
【发布时间】:2021-02-28 10:42:25
【问题描述】:

我有一个嵌套的 JSON,我想循环并根据键获取值。

Data.json

{
  "car": [
    {
      "date": 1324599600000,
      "values": [
        {
          "name": "Audi",
          "price": "11212.12"
        },
        {
          "name": "Bmw",
          "price": "22321.3"
        },
        {
          "name": "Cittroen",
          "price": "23432.2"
        },
        {
          "name": "Tuareg",
          "price": "556456.3"
        }
      ]
    }

我基于 JSON 数据创建了 3 个对象模型。

CarResponse.java

public class CarResponse {

    @JsonProperty(value = "car")
    List<Car> cars;

    //getters,setters

Car.java

public class Car{

    @JsonProperty("values")
    private List<CarValue> carValue;  
    //getters, setters

CarValue.java

public class CarValue {
    private String name;
    private BigDecimal price;
    //getters, setters 

DataParse.java

public class DataParse{
    
        CarResponse response;
    
        public CarValue parse(){
            CarValue carValue = new CarValue();
    
            //NEED HELP WITH THIS PART
            for(Car cars : response.getQuote()){
                for(CarValue qv : cars.getCarValue()){
                    String type = qv.get("name").asText();
                    Decimal value = qv.get("price").decimalValue();
    
                    carValue.setName(qv.getName());
                    carValue.setPrice(qv.getPrice());
                    
                }
            }
    
            return quoteValue;
        }
    } 

在 JSON 中,我需要检查车名是否为 Audi,如果车名是 Tuareg,则保存并显示。

代码的嵌套for循环部分不起作用

for(Car cars : response.getQuote()){
                for(CarValue qv : cars.getCarValue()){
                    String type = qv.get("name").asText();
                    Decimal value = qv.get("price").decimalValue();
    
                    carValue.setName(qv.getName());
                    carValue.setPrice(qv.getPrice());
                    
                }
            }

仅将其作为我在此步骤中需要执行的操作的示例,即检查 JSON 中的密钥以及是否是该密钥,例如 name = Audi 然后

carValue.setName(qv.getName());

通过上面的代码,我在控制台中得到了这个。

carValue=[carValue{name=null, price=null}

【问题讨论】:

    标签: java json spring-boot


    【解决方案1】:

    假设您的反序列化工作正常,您应该将“不工作”的部分更改为:

    String type = qv.getName();
    BigDecimal value = qv.getPrice();
    

    如果出于某种原因你想使用这个 qv.get(key) 方法,你应该发布它的实现。

    当 getName 和 getPrice 仍然返回 null 时,表示您的反序列化有问题,例如错误的 setter 方法名称。尽管如此,没有实现是无法理解的。

    这里是 Jackson 的 official documentation,默认情况下与 spring-boot 一起用于 JSON 序列化/反序列化的库。

    这里是Spring blog post

    【讨论】:

    • 我刚刚更新了我的问题,我遇到了嵌套 for 循环和您更新的部分的问题。在第一个循环中,我尝试遍历CarResponse 列表以获取Car,因为它包含CarValues,其中包含字段nameprice。但我想我做错了什么,因为第二个循环中的cars.getCarValue() 带有红色下划线,错误为foreach not applicable to type 'modal.CarValue'
    • 根据 Car.java 类,名为 carValue 的属性的类型为 List,但您得到的错误意味着方法 cars.getCarValue() 返回的单个对象输入 CarValue,显然你不能循环遍历它,因为它不是一个 List,因此会报错。
    • 那么我该怎么做才能获得 CarValue 属性? @gere
    • 不看你的setter和getter,以及所有的对象实例是如何创建的,我真的不能说。
    猜你喜欢
    • 2022-11-28
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 2022-11-25
    相关资源
    最近更新 更多