gpt4 book ai didi

json - Jackson 反序列化 ... 意外 token (END_OBJECT),

转载 作者:行者123 更新时间:2023-12-03 23:43:19 25 4
gpt4 key购买 nike

我正在尝试使用 Jackson 将 JSON 数组反序列化为 Java 集合。这是由我昨晚 Can I instantiate a superclass and have a particular subclass be instantiated based on the parameters supplied 提出的这个问题的答案所激发的。

我得到的错误是(为可读性添加了换行符):

org.codehaus.jackson.map.JsonMappingException: 
Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type'
that is to contain type id (for class sempedia.model.query.QueryValue)
at [Source: java.io.StringReader@325aef; line: 1, column: 175]
(through reference chain: sempedia.model.query.QueryProperty["values"])

我的情况相当复杂。我的数组包含对象,这些对象本身包含一个数组值。该数组又包含也是对象但不一定相同的值(因此是多态性)。

这是一个示例 JSON 字符串:
[
{
"id":"74562",
"uri":"http://dbpedia.org/ontology/family",
"name":"family",
"values":[
{
"id":"74563",
"uri":"http://dbpedia.org/resource/Orycteropodidae",
"name":"Orycteropodidae"
}
],
"selected":false
},
{
"id":"78564",
"uri":"http://dbpedia.org/ontology/someNumber",
"name":"someNumber",
"values":[
{
"lower":"45",
"upper":"975",
}
],
"selected":true
}
]

我想使用这个(下面的)代码或类似的东西来获取一个对象,它是我称之为 Collection<QueryProperty>queryProperties 的一个实例
ObjectMapper mapper = new ObjectMapper();  
Collection<QueryProperty> queryProperties =
queryProperties = mapper.readValue(query,
new TypeReference<Collection<QueryProperty>>(){});

下面列出了我的反序列化类(它们有我没有打印的公共(public) getter/setter):
public class QueryProperty {    
int id;
String uri;
String name;
Set<QueryValue> values;
String selected;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes({
@Type(value = ResourceQueryValue.class),
@Type(value = NumericQueryValue.class)
})
public abstract class QueryValue {
String type;
}
ResourceQueryValue
public class ResourceQueryValue extends QueryValue{
int id;
String uri;
String name;
}
NumericQueryValue 相同的 JSON 不包含此类型的对象。
public class NumericQueryValue extends QueryValue{
double lower;
double upper;
}

堆栈跟踪的初始部分:
org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type' that is to contain type id  (for class sempedia.model.query.QueryValue)
at [Source: java.io.StringReader@325aef; line: 1, column: 175] (through reference chain: sempedia.model.query.QueryProperty["values"])
at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
at org.codehaus.jackson.map.deser.StdDeserializationContext.wrongTokenException(StdDeserializationContext.java:240)
at org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:86)
at org.codehaus.jackson.map.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:89)

最佳答案

正如经常发生的那样,写出一个问题可以帮助您找到解决方案。所以我需要做两件事。

首先,我需要将类型信息添加到 JSON 中——这不是我真正想做的,但我想你需要在某处提供该信息。

然后我需要将 QueryValue 上的注释编辑为:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")  
@JsonSubTypes({
@Type(value = ResourceQueryValue.class, name = "ResourceQueryValue"),
@Type(value = NumericQueryValue.class, name= "NumericQueryValue")
})

关于json - Jackson 反序列化 ... 意外 token (END_OBJECT),,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6435062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com