#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);