我的结构如下:
{
"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来完成?
谢谢!
爱德华多
答案 0 :(得分:2)
您希望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,rg.getColumn(),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批注在此字段中注册它。