如何使用 Jackson 在 Java 中阅读下面的内容?
innings:
- 1st innings:
team: England
deliveries:
- 0.1:
batsman: ME Trescothick
bowler: DT Johnston
non_striker: EC Joyce
runs:
batsman: 0
extras: 0
total: 0
我尝试过以下类结构,但没有一个起作用:
选项 1:
public class Inning {
public String team;
public Map<String, Delivery> deliveries;
}
public Map<String,Inning> innings;
选项 2:
我替换Map<K,V>
与 List<V>
选项 1 给出:
java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap` out of START_ARRAY token
at [Source: (File); line: 30, column: 3] (through reference chain: cricket.CricSheet["innings"])
at cricket.CricSheet.readFromFile(CricSheet.java:20)
CricSheet.java:20
at cricket.App.main(App.java:12)
App.java:12
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.LinkedHashMap` out of START_ARRAY token
at [Source: (File); line: 30, column: 3] (through reference chain: cricket.CricSheet["innings"])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)
MismatchedInputException.java:63
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)
DeserializationContext.java:1343
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139)
DeserializationContext.java:1139
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093)
DeserializationContext.java:1093
at com.fasterxml.jackson.databind.deser.std.StdDeserializer._deserializeFromEmpty(StdDeserializer.java:600)
StdDeserializer.java:600
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:360)
MapDeserializer.java:360
at com.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:29)
MapDeserializer.java:29
at com.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:138)
FieldProperty.java:138
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:288)
BeanDeserializer.java:288
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:151)
BeanDeserializer.java:151
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013)
ObjectMapper.java:4013
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2902)
ObjectMapper.java:2902
at cricket.CricSheet.readFromFile(CricSheet.java:18)
选项 2 给出:
Exception in thread "main" java.lang.RuntimeException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "1st innings" (class cricket.Inning), not marked as ignorable (2 known properties: "deliveries", "team"])
at [Source: (File); line: 31, column: 7] (through reference chain: cricket.CricSheet["innings"]->java.util.ArrayList[0]->cricket.Inning["1st innings"])
at cricket.CricSheet.readFromFile(CricSheet.java:20)
CricSheet.java:20
at cricket.App.main(App.java:12)
App.java:12
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "1st innings" (class cricket.Inning), not marked as ignorable (2 known properties: "deliveries", "team"])
at [Source: (File); line: 31, column: 7] (through reference chain: cricket.CricSheet["innings"]->java.util.ArrayList[0]->cricket.Inning["1st innings"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:61)
UnrecognizedPropertyException.java:61
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:823)
DeserializationContext.java:823
最佳答案
如果将 YAML 粘贴到在线 YAML 解析器中,也许您可以更好地理解 YAML 结构,例如https://yaml-online-parser.appspot.com/
它显示:
Output
{ "innings": [ { "1st innings": { "deliveries": [ { "0.1": { "batsman": "ME Trescothick", "bowler": "DT Johnston", "runs": { "batsman": 0, "total": 0, "extras": 0 }, "non_striker": "EC Joyce" } } ], "team": "England" } } ] }
如您所见,根目录是 Map<String, List<Map<String, Inning>>>
,其中
- 外部 map 有一个带有键
"innings"
的条目,和值:- 只有一个元素的数组:
- 内部 map 有一个带有键
"1st innings"
的条目,和值:- 安
Inning
对象
- 安
- 内部 map 有一个带有键
- 只有一个元素的数组:
自 Inning
有字段team
和deliveries
,它确实映射到从第三个 {
开始的对象.
所以外面有 2 个字符串:"innings"
和"1st innings"
。您的两次尝试都不允许使用两个名称,因此它们不可能起作用。
我将让您决定是否需要为该额外 map 开设类(class)。我建议创建一个 Game
类 innings
字段是 List<?>
。是否?
是 Map<String, Inning>
或一些带有 "1st innings"
的类(class)领域由你决定。
关于Java:帮助使用 Jackson 读取 YAML 中的关联数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57120479/