Динамический Json в Java Pojo

#java #json #jackson

#java #json #джексон

Вопрос:

Я хочу сопоставить следующий json с pojo на Java. Во фрагменте, показанном ниже, result находится объект Json, значением которого является другой объект json, представляющий собой карту. Я попытался преобразовать это в Pojo, но это не удалось. Ключи на result карте являются динамическими, и я не могу угадать их заранее.

          final_result : 
         { 
              "result": 
                {
                    "1597696140": 70.32,
                    "1597696141": 89.12,
                    "1597696150": 95.32,
                }
         }

  

Pojo, который я создал, является :

 
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResultData {
  Map<Long, Double> resultMap;

  public ResultData(Map<Long, Double> resultMap) {
    this.resultMap = resultMap;
  }

  public ResultData() {
  }

  @Override
  public String toString() {
    return super.toString();
  }
}
  

При попытке создать pojo с помощью ObjectMapper :

 ObjectMapper objectMapper = new ObjectMapper();
      ResultData resultData = objectMapper.readValue(resultData.getJSONObject("result").toString(), ResultData.class);
  

Что я, возможно, здесь делаю не так?

Комментарии:

1. Ну, вы сказали Джексону игнорировать неизвестные свойства, такие как «1597696140». Я также не уверен, что Jackson способен «из коробки» анализировать строки в longs, поэтому вам может потребоваться добавить сюда пользовательскую десериализацию — или попробовать с Map<String, String> .

2. Спасибо! Я сопоставил с Map<Long, Double> и установил результирующий объект map в pojo.

Ответ №1:

Предположим, ваша JSON полезная нагрузка выглядит следующим образом:

 {
  "final_result": {
    "result": {
      "1597696140": 70.32,
      "1597696141": 89.12,
      "1597696150": 95.32
    }
  }
}
  

Вы можете десериализовать его в class:

 @JsonRootName("final_result")
class ResultData {
    private Map<Long, Double> resu<

    public Map<Long, Double> getResult() {
        return resu<
    }

    @Override
    public String toString() {
        return result.toString();
    }
}
  

Как показано ниже:

 import com.fasterxml.jackson.annotation.JsonRootName;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.io.IOException;
import java.util.Map;

public class Main {

    public static void main(String[] args) throws IOException {
        File jsonFile = new File("./src/main/resources/test.json");

        ObjectMapper mapper = new ObjectMapper();
        mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
        ResultData resultData = mapper.readValue(jsonFile, ResultData.class);
        System.out.println(resultData);
    }
}
  

Приведенный выше код выводит:

 {1597696140=70.32, 1597696141=89.12, 1597696150=95.32}
  

Ответ №2:

Преобразование JSONObject в Map и установка map в поле pojo решило проблему и не привело меня к написанию пользовательского десериализатора.

 Map<Long, Double> resultData = objectMapper.readValue(resultData.getJSONObject("result").toString(), Map.class);
FinalResultData finaResultData = new FinalResultData(resultData);