如何使用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}