goo*_*ain 3 java arrays json list jackson
我已尝试一切方法来读取以下 JSON 字符串,但仍然收到以下错误。
我的 JSON 字符串是有效的,我认为问题在于子元素的映射存在问题。
这是我的 JSON 字符串:
[
{
"denotations": [
{
"id": [
"CUI-less"
],
"obj": "disease",
"span": {
"begin": 31,
"end": 41
}
}
],
"elapsed_time": {
"ner": 2.759,
"normalization": 0.002,
"tmtool": 0.148,
"total": 2.91
},
"logits": {
"disease": [
[
{
"end": 41,
"id": "CUI-less",
"start": 31
},
0.999957799911499
]
],
"drug": [],
"gene": [],
"species": []
},
"project": "BERN",
"sourcedb": "PubMed",
"sourceid": "2832773",
"text": "Absence of humoral immunity to poliovirus in vaccinated individuals.",
"timestamp": "Thu Aug 06 13:42:27 +0000 2020"
}
]
Run Code Online (Sandbox Code Playgroud)
我的 Java POJO(Logit 类)
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonPropertyOrder({
"disease",
"drug",
"gene",
"species"
})
public class Logits {
@JsonProperty("disease")
private List<List<Disease>> disease = null;
@JsonProperty("drug")
private List<Object> drug = null;
@JsonProperty("gene")
private List<Object> gene = null;
@JsonProperty("species")
private List<Object> species = null;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@JsonProperty("disease")
public List<List<Disease>> getDisease() {
return disease;
}
@JsonProperty("disease")
public void setDisease(List<List<Disease>> disease) {
this.disease = disease;
}
@JsonProperty("drug")
public List<Object> getDrug() {
return drug;
}
@JsonProperty("drug")
public void setDrug(List<Object> drug) {
this.drug = drug;
}
@JsonProperty("gene")
public List<Object> getGene() {
return gene;
}
@JsonProperty("gene")
public void setGene(List<Object> gene) {
this.gene = gene;
}
@JsonProperty("species")
public List<Object> getSpecies() {
return species;
}
@JsonProperty("species")
public void setSpecies(List<Object> species) {
this.species = species;
}
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}
}
Run Code Online (Sandbox Code Playgroud)
我什至尝试过String[][] disease,但仍然无法解析。
解析代码:
String denotations = restTemplate.getForObject("http://com/text",String.class);
System.out.println(denotations);
ObjectMapper mapper = new ObjectMapper();
BernOBJ denoObj = mapper.readValue(denotations, BernOBJ.class);
System.out.println(denoObj);
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
com.fasterxml.jackson.databind.exc.MismatchedInputException:无法反序列化实例
com.goodyzain.bern.models.BernOBJ[源:(String)"[ { "denotations": [ { "id": [ "CUI-less" ], "obj": "disease", "span": { "begin": 31 处的 START_ARRAY 令牌已满,“结束”:41}}],“elapsed_time”:{“ner”:2.759,“标准化”:0.002,“tmtool”:0.148,“总计”:2.91},“logits”:{“疾病”:[ “[截断 555 个字符];行:1,列:1] 在 com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59) ~[jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml。 jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1468) ~[jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1242) ~ [jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1190) ~[jackson-databind-2.11.1.jar:2.11.1]在 com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeFromArray(BeanDeserializer.java:604) ~[jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml.jackson.databind.deser.BeanDeserializer。 _deserializeOther(BeanDeserializer.java:190) ~[jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:166) ~[jackson-databind -2.11.1.jar:2.11.1] 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4482) ~[jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml .jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3434) ~[jackson-databind-2.11.1.jar:2.11.1] 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3402) 〜[jackson-databind-2.11.1.jar:2.11.1] 在 com.goodyzain.bern.BernAPIController.getUsersById(BernAPIController.java:41) 〜[classes/:na] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法) ~[na:1.8.0_252] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_252] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[ na:1.8.0_252]在java.lang.reflect.Method.invoke(Method.java:498)〜[na:1.8.0_252]在org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java: 190) ~[spring-web-5.2.8.RELEASE.jar:5.2.8.RELEASE] 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) ~[spring-web-5.2 .8.RELEASE.jar:5.2.8.RELEASE] 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:105) ~[spring-webmvc-5.2.8.RELEASE。 jar:5.2.8.RELEASE] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:
您当前遇到的错误:
Cannot deserialize instance of com.goodyzain.bern.models.BernOBJ out of START_ARRAY token at [Source: (String)"[ {
意味着您有一个 JSON 对象数组(以 开头[{...),但尝试将其解析为单个对象:
BernOBJ denoObj = mapper.readValue(denotations, BernOBJ.class);
Run Code Online (Sandbox Code Playgroud)
数组通常应该被解析为值列表,例如:
List<BernOBJ> denoObj = mapper.readValue(denotations,
mapper.getTypeFactory().constructCollectionType(List.class, BernObj.class));
Run Code Online (Sandbox Code Playgroud)
此外,您的List<List<Disease>>列表并不完全包含Disease对象,它包含一个对象和一个double值:
[
[
{
"end": 41,
"id": "CUI-less",
"start": 31
},
0.999957799911499
]
]
Run Code Online (Sandbox Code Playgroud)
我不确定那里是否总是有一个对象和一个数值,以及它的含义,但您可以执行以下操作。创建一个附加类,例如DiseasePair,并像这样映射它:
@JsonFormat(shape = JsonFormat.Shape.ARRAY)
@JsonPropertyOrder({ "disease", "numericValue" })
class DiseasePair {
private Disease disease;
private Double numericValue;
}
Run Code Online (Sandbox Code Playgroud)
然后将您的List<List<Disease>>字段类型更改为List<DiseasePair>.