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

问题描述 投票:0回答:1

我有这样的结构:

{
    "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来完成?

谢谢!

爱德华多

java json jackson deserialization json-deserialization
1个回答
0
投票

您希望Map代表JSON,但JSON Object可以默认映射到JSON ArrayListSet。我建议在array中使用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批注在此字段中注册它。

© www.soinside.com 2019 - 2024. All rights reserved.