如何使用Java';将嵌套JSON数组反序列化到映射中;杰克逊图书馆在哪里?
我有一个这样的结构:如何使用Java';将嵌套JSON数组反序列化到映射中;杰克逊图书馆在哪里?,java,json,jackson,deserialization,json-deserialization,Java,Json,Jackson,Deserialization,Json Deserialization,我有一个这样的结构: { "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, BigDecima
{
"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<>();
}
如何使用Jackson实现这一点?
谢谢
Eduardo您希望
Map
在JSON
一侧由JSON对象表示,但是有一个JSON数组
,默认情况下可以映射到List
、Set
或Array
。我建议在POJO
中使用List
,并创建一个将数据转换为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
}
在另一种情况下,您需要为映射
实现一个自定义
反序列化器,并使用注释将其注册到此字段
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}