【问题标题】:JSON response with dash in the key-name键名中带有破折号的 JSON 响应
【发布时间】:2017-04-21 07:49:44
【问题描述】:

我在休息时使用 feign。不幸的是,我得到的回复之一是这样的:

{
    "customer-id" : "0123"
}

JSON 响应会自动映射到我的 POJO 之一。此响应对象不能具有名称为“customer-id”的属性字段,因为标识符名称中不允许使用破折号 (-)。

我尝试了以下方法:

public class LookUpAccountsResponse {
        @JsonProperty("customer-id")
        private String customerId;
}

但不幸的是,这不起作用。有人对如何解决这个问题有建议吗?

【问题讨论】:

  • JSON 规范中的什么地方规定不允许使用破折号?
  • JSON 规范是什么意思?我知道 JSON 响应的键中有一个 - (“客户 ID”)。问题是创建一个具有相似名称的 Java 属性字段(以便可以映射)。
  • 有一个有效 JSON 密钥的标准定义 json.org... 我不确定错误是什么,但下面的答案表明破折号不是问题,所以你可以试试像他们一样创建minimal reproducible example
  • 感谢上帝,我们有 StackOverflow。它总是救我

标签: java json jackson response netflix-feign


【解决方案1】:

com.google.gson.GsonDecoder

不知道为什么JsonProperty 在您的类路径中,但请参阅“字段命名支持”https://github.com/google/gson/blob/master/UserGuide.md#json-field-naming-support

@SerializedName 是您想要的 Gson 注释

或者完全切换到使用带有JacksonDecoderfeign-jackson 依赖项

【讨论】:

  • 最后,这对我有用。在名称中带有“hypen”的属性顶部添加了@SerializedName。它看起来像 `@JsonProperty("auth-key") @SerializedName("auth-key") private String authKey;. I left the @JsonProperty` 注释,因为它与所有其他属性一样。
  • 这意味着你的类路径中同时包含 Jackson 和 Gson,这真的是不必要的
  • 我重构并删除了@JsonProperty("auth-key"),这是完全没有必要的。如果项目中没有其他依赖项,将从类路径中删除 jackson。同时,在您发表评论后,我重新访问了我的模块,并在我的application.yml 1.spring.http.converters.preferred-json-mapper= gson 和 2.gson.field-naming-policy= LOWER_CASE_WITH_DASHES 中添加了以下内容作为默认策略。现在,我不需要添加@SerializedName ("auth-key"),因为默认策略很小心。
【解决方案2】:

它工作正常。这是一个最小的例子:

  public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
    SomeClass sc = new ObjectMapper().readValue("{\"property-with-dash\": 5}", SomeClass.class);

    System.out.println(sc.propertyWithDash);
  }

  public static class SomeClass {
    @JsonProperty("property-with-dash")
    private int propertyWithDash;
  }

这将按预期打印5。没有投诉。

【讨论】:

  • 我没有使用 ObjectMapper。我不确定 Feign 框架如何将响应映射到我的响应对象。
  • 你知道它使用的是什么框架吗?因为这将决定如何配置它。自从您使用 @JsonProperty 注释后,我就假设是杰克逊。
  • @Robert 您使用的是GsonDecoder 还是JacksonDecoder?如果是后者,它确实使用 ObjectMapper
  • 我想我已经用 JsonProperty 注释让所有人都失望了。我现在已将其更改为 SerializedName,这确实有效。
【解决方案3】:

使用 JsonObjects 和 JsonArrays 将允许您将键和值作为字符串获取

【讨论】:

    【解决方案4】:

    您可以使用@JsonAlias。

    它为反序列化过程中要接受的属性定义一个或多个替代名称,即将 JSON 数据设置为 Java 对象。

    @JsonAlias("customer-id")

    私有字符串 customerId;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      相关资源
      最近更新 更多