如何将对象节点的Json数组解析为不同的dto对象

我从Weather api得到了Json的回复:

{   "data": [
    {
      "moonrise_ts": 1572876192,"wind_cdir": "SE","rh": 84,"pres": 982.153,"high_temp": 9.3,"sunset_ts": 1572884637,"ozone": 322.467,"moon_phase": 0.552016,"wind_gust_spd": 6.28386,"snow_depth": 0,"clouds": 77,"ts": 1572825660,"sunrise_ts": 1572850839,"app_min_temp": 8.1,"wind_spd": 1.39257,"pop": 40,"wind_cdir_full": "southeast","slp": 985.03,"valid_date": "2019-11-04","app_max_temp": 12.5,"vis": 0,"dewpt": 7.7,"snow": 0,"uv": 0.697746,"weather": {
        "icon": "c04d","code": 804,"description": "Overcast clouds"
      },"wind_dir": 134,"max_dhi": null,"clouds_hi": 0,"precip": 0.705078,"low_temp": 8.1,"max_temp": 12.5,"moonset_ts": 1572907595,"datetime": "2019-11-04","temp": 10.3,"min_temp": 8.1,"clouds_mid": 45,"clouds_low": 54
    },{
      "moonrise_ts": 1572964153,"wind_cdir": "SW","rh": 86,"pres": 993.705,"high_temp": 12.4,"sunset_ts": 1572970931,"ozone": 323.897,"moon_phase": 0.648931,"wind_gust_spd": 10.783,"clouds": 91,"ts": 1572912060,"sunrise_ts": 1572937349,"app_min_temp": 8,"wind_spd": 2.9909,"pop": 30,"wind_cdir_full": "southwest","slp": 996.693,"valid_date": "2019-11-05","app_max_temp": 12.4,"dewpt": 7.5,"uv": 1.5811,"wind_dir": 226,"clouds_hi": 4,"precip": 0.427734,"low_temp": 6,"max_temp": 12.4,"moonset_ts": 1572998028,"datetime": "2019-11-05","temp": 9.6,"min_temp": 8,"clouds_mid": 41,"clouds_low": 85
    }   ],"city_name": "London","lon": "-0.09184","timezone": "Europe/London","lat": "51.51279","country_code": "GB","state_code": "ENG" }

这是预测的2天。我将使用16天,这样会更长。但是我想将其拆分,因此每天都是一个单独的对象,仅包含字段“ city_name”,“ valid_date”,“ temp”,“ clouds”和“ pop”。如何做到这一点,尤其是在数组嵌套且“ city_name”不在其内部时。我有以下反序列化类,该类显然不起作用:

public class WeatherDtoDeserializer extends StdDeserializer<WeatherDto> {

    public WeatherDtoDeserializer() {
        this(null);
    }

    public WeatherDtoDeserializer(Class<?> vc) {
        super(vc);
    }

    @Override
    public WeatherDto deserialize(JsonParser jp,DeserializationContext ctxt)
            throws IOException,JsonProcessingException {

        JsonNode weatherNode = jp.getcodec().readTree(jp);
        WeatherDto weatherDto = new WeatherDto();
        weatherDto.setCity(weatherNode.get("city_Name").textvalue());
        weatherDto.setDate(LocalDate.parse(weatherNode.get("data").get("valid_date").textvalue()));
        weatherDto.setTemperature(weatherNode.get("data").get("temp").intvalue());
        weatherDto.setCloudiness(weatherNode.get("data").get("clouds").intvalue());
        weatherDto.setRainfall(weatherNode.get("data").get("pop").intvalue());
        return weatherDto;
    }
}

这也是我在WeatherApiClient中获取预报的方法:

 public List<WeatherDto> getForecast(Airport airport) {
        URI url = UriComponentsBuilder.fromHttpUrl(getBaseUrl() +
                "city=" + airport.getcity() +
                "&country=" + airport.getcountryCode() +
                "&key=" + KEY)
                .build()
                .encode()
                .toUri();
        return Optional.ofNullable(restTemplate.getForObject(url,WeatherDto[].class))
                .map(Arrays::asList)
                .orElse(new ArrayList<>());
    }

在尝试获取预测并打印出来时出现错误: Error

谢谢。

nidi_1 回答:如何将对象节点的Json数组解析为不同的dto对象

我要说的最好的方法是先从city_Name获得JSON

String city = weatherNode.get("city_Name").textValue();

然后从data的{​​{1}}中获得JSON Array,并通过迭代每个Object节点将它们转换为Object nodes

WeatherDto

要返回List<WeatherDto> dtos = new ArrayList<>(); Iterator<JsonNode> itr = weatherNode.get("data").elements(); while(itr.hasNext()) { JsonNode node = its.next(); WeatherDto weatherDto = new WeatherDto(); // set all values to weatherDto weatherDto.setCity(city); weatherDto.setDate(LocalDate.parse(node.get("valid_date").textValue())); weatherDto.setTemperature(node.get("temp").intValue()); weatherDto.setCloudiness(node.get("clouds").intValue()); weatherDto.setRainfall(node.get("pop").intValue()); // finally add that dto to List dtos.add(weatherDto); } return dtos; ,您必须将List<WeatherDto>调整为extends StdDeserializer<WeatherDto>

本文链接:https://www.f2er.com/3164233.html

大家都在问