com.fasterxml.jackson.databind.exc.MismatchedInputException:无法反序列化实例?

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:

Ser*_*nin 5

您当前遇到的错误:

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>.