【问题标题】:Java Jackson encoder type mismatched type because of array由于数组,Java Jackson 编码器类型不匹配
【发布时间】:2021-09-02 09:12:06
【问题描述】:

我将客户端设置为后端(不幸的是我无法更改它)并发送如下结构:

{ 
   "code":"Success",
   "structure": {
       "sth":"sth"
   }
}

但当代码为 Error 时,它会返回:

{ 
   "code":"Error",
   "structure":[]
}

因为这个数组很难反序列化。我是这样尝试的:

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
class Structure {
    private String code;
    private Sth structure;
}

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false)
@JsonIgnoreType
class Sth{
    private String sth;
}

但是JsonIgnoreType 总是忽略Sth 不仅在它是不兼容类型的情况下...... 你有什么想法吗?

#编辑

错误信息:

2021-09-02 11:56:28.623 DEBUG [http-nio-8021-exec-2] [package]: [function] com.fasterxml.jackson.databind.exc.MismatchedInputException: 无法反序列化 @987654327 的实例@ out of START_ARRAY 令牌 在 [来源:(BufferedReader);行:1,列:113](通过引用链:结构[“结构”])

【问题讨论】:

  • Error 是否包含字符串、数字或Sth 的数组?
  • 似乎structure 在一个响应中是一个对象,而在另一个响应中是一个数组。我不确定杰克逊是否可以选择处理这个问题,这是一个非常糟糕的 API。您也许可以尝试使用自定义反序列化器,并将 structure 设为 Object,这就是我会尝试的。
  • 不完全是这个 JSON 代码来自我看到的一个肮脏的后端......这可能会从相同的 enpoint json 或 html 发送给你,这取决于它想要什么......

标签: java json jackson lombok


【解决方案1】:

我通过创建特殊的 JacksonDeserializer 来解决此问题,例如

public class StartShiftResponseDeserializer extends JsonDeserializer {

    @Override
    public type deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        JsonNode node = jsonParser.getCodec().readTree(jsonParser);
       ...
        try {
            ...
        } catch (MismatchedInputException e) {
            Sth= null;
        } catch (ClassCastException e) {
            Sth= null;
        }
        return new Structure (..., Sth);

而且效果很好;)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2012-07-10
    • 1970-01-01
    • 2019-09-12
    相关资源
    最近更新 更多