【问题标题】:Deserialization of JSON with integer keys and string value in Spring-boot在 Spring-boot 中使用整数键和字符串值反序列化 JSON
【发布时间】:2020-12-15 10:55:12
【问题描述】:

我必须使用 Feign 库在 Spring-boot 中反序列化并序列化一个具有整数键和字符串值的简单 JSON。我知道,如果密钥在字符串中,这在 Spring-boot 中非常简单,具有自动序列化和反序列化。我的 JSON 看起来像:

"avatar": {
            "48x48": "https://wfrjira.int.abc.com/secure/useravatar?ownerId=person&avatarId=1234",
            "24x24": "https://wfrjira.int.abc.com/secure/useravatar?size=small&ownerId=person&avatarId=1234"
        }

我的具有正确 getter 和 setter 类的 POJO bean 是:

class Avatar {
private String _48x48;
private String _24x24;

public Avatar() {
}

public Avatar(String _48x48, String _24x24) {
    this._48x48 = _48x48;
    this._24x24 = _24x24;
}                               Getters and Setter ...

我收到以下错误:

出现意外错误(类型=内部服务器错误,状态=500)。 提取类型 [class [Lcom.XXXXXX.JiraResourceData;] 和内容类型 [application/json;charset=UTF-8] 的响应时出错;嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 [Lcom.XXXXXX.JiraResourceData; 的实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException:无法从 [Source: (PushbackInputStream) 的 START_OBJECT 令牌中反序列化 [Lcom.XXXXXX.JiraResourceData; 的实例;行:1,列:1] feign.codec.DecodeException:提取类型 [class [Lcom.XXXXXX.JiraResourceData;] 和内容类型 [application/json;charset=UTF-8] 的响应时出错;嵌套异常是 org.springframework.http.converter.HttpMessageNotReadableException:JSON 解析错误:无法从 START_OBJECT 令牌中反序列化 [Lcom.XXXXXX.JiraResourceData; 的实例;嵌套异常是 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize of [Lcom.XXXXXX.JiraResourceData; out of START_OBJECT token 在 [来源:(PushbackInputStream);行:1,列:1]

我知道我需要在 Avatar 类中声明变量,其名称与 JSON 的键匹配,但不能以数字开头声明字符串。有没有其他方法可以在 Spring-boot 中解决这个问题?任何帮助将不胜感激。

【问题讨论】:

  • 你可以自己写反序列化器。

标签: java spring-boot fasterxml


【解决方案1】:

首先,您的最后一行JSON 有一个逗号。删除它。此外,JSON 应嵌入另一组括号中。

另外,用 @JsonRootName("avatar") 注释你的类,因为你的类是大写的,而你的 JSON 是小写的。

此外,您可能希望将字段重命名为 JSON 中的字段名称或使用 @JsonProperty("my-json-name") 进行注释

【讨论】:

  • 逗号是错字,我更正了。实际上,我从一个更大的 JSON 中提取了 JSON,其中其他元素是普通的字符串键和字符串值对。重命名这些字符串字段的问题是字符串字段不能以数字开头。
  • 好吧,通常将 JSON 转换为 DTO 我个人使用 IntelliJ 中的插件来复制 JSON,它会为我制作一个 DTO。我建议你也这样做,否则这是一项繁琐的任务。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2018-09-07
  • 2016-12-22
  • 1970-01-01
相关资源
最近更新 更多