gpt4 book ai didi

java - 如何使用 Java 的 Jackson 库将嵌套的 JSON 数组反序列化到 Map 中?

转载 作者:行者123 更新时间:2023-11-30 01:43:21 27 4
gpt4 key购买 nike

我的结构如下:

{
"name": "user",
"values":[["0.00207760","18.48000000"],["0.00207740","40.00000000"],["0.00207710","2.26000000"]]
}

我想使用流行的 Jackson 库反序列化为这样的类:

public class Values {

public String name;

public Map<BigDecimal, BigDecimal> values = new HashMap<>();

}

其中 values 属性中的每个条目都成为类映射中的键/值条目。

但是,如果我尝试使用 Jackson 进行简单的反序列化,则会收到此错误:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.TreeMap<java.lang.Object,java.lang.Object>` out of START_ARRAY token
at [Source: (String)"{"name": "user","values":[["0.00207760","18.48000000"],["0.00207740","40.00000000"],["0.00207710","2.26000000"]]...
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1442)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1216)
...

如何使用 Jackson 来实现这一点?

谢谢!

爱德华多

最佳答案

您期望MapJSON 上边由 JSON Object 表示但有一个JSON Array默认情况下可以映射到 List , Setarray 。我建议使用List<List<BigDecimal>>POJO并创建一个将数据转换为 Map 的方法:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.json.JsonMapper;

import java.io.File;
import java.math.BigDecimal;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class JsonPathApp {

public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();

ObjectMapper mapper = JsonMapper.builder().build();
Values values = mapper.readValue(jsonFile, Values.class);
System.out.println(values.getValuesAsMap());
}
}

class Values {

private String name;
private List<List<BigDecimal>> values;

public Map<BigDecimal, BigDecimal> getValuesAsMap() {
return values.stream().collect(Collectors.toMap(
k -> k.get(0),
v -> v.get(1),
(u, v) -> {
throw new IllegalStateException(String.format("Duplicate key %s", u));
},
LinkedHashMap::new));
}

// getters, setters, toString
}

上面的代码打印:

{0.00207760=18.48000000, 0.00207740=40.00000000, 0.00207710=2.26000000}

在其他情况下,您需要实现 custom Map 的解串器并使用@JsonDeserialize为此字段注册它注释。

关于java - 如何使用 Java 的 Jackson 库将嵌套的 JSON 数组反序列化到 Map 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59111691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com