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

我的结构如下:

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

谢谢!

爱德华多

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

您希望function runOne() { var ss=SpreadsheetApp.getActiveSpreadsheet(); var sh=ss.getSheetByName('Sheet1'); var rg=sh.getActiveRange(); sh.clearContents(); var vA=[['rg.getRow()',rg.getRow()],['rg.getColumn()',rg.getColumn()],['rg.getLastRow()',rg.getLastRow()],['rg.getLastColumn()',rg.getLastColumn()],['rg.getNumRows()',rg.getNumRows()],['rg.getNumColumns()',rg.getNumColumns()]]; var vB=[]; for(var i=0;i<rg.getHeight();i++) { vB[i]=[]; for(var j=0;j<rg.getWidth();j++) { vB[i][j]=Utilities.formatString('%s,%s',rg.getRow()+i,rg.getColumn()+j); } } sh.getRange(rg.getRow(),rg.getColumn(),vB.length,vB[0].length).setValues(vB); sh.getRange(sh.getLastRow()+1,vA.length,vA[0].length).setValues(vA); } 的{​​{1}}端由Map表示,但是有一个JSON可以默认映射到JSON Object,{{ 1}}或JSON Array。我建议在List中使用Set并创建一个将数据转换为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 } 反序列化器,并使用@JsonDeserialize批注在此字段中注册它。

本文链接:https://www.f2er.com/3004754.html

大家都在问