【问题标题】:JSON - Get Jackson to use the JsonProperty when serializingJSON - 让 Jackson 在序列化时使用 JsonProperty
【发布时间】:2016-10-18 07:30:16
【问题描述】:

是否可以通过简单的方式配置让 Jackson(用于 Spring Boot REST 服务)在序列化对象时使用 JsonProperty 属性?

有一个 Spring Boot REST 客户端与 Spring Boot REST 服务通信。 REST 服务正在使用字段名称生成 JSON,但 REST 客户端在收到 JSON 时会尝试使用 @JsonProperty 注释中指定的值对其进行解析。

我不知道是什么原因导致它在序列化/反序列化过程中采用不同的方法,以及可以做些什么来让它们用同一种语言说话。我希望这是一个可以在某处设置的简单配置。

客户端收到的 JSON

16:13:47.491 [main] INFO TokenServiceImpl - AccessToken 收到:"token":"2YotnFZFEjr1zCsicMWpAA","expiresIn":3600,"refreshToken":"YES","tokenType": “示例”}

抛出异常

Caused by: org.codehaus.jackson.map.exc.UnrecognizedPropertyException: Unrecognized field "token" (C lass org.jboss.resteasy.skeleton.key.representations.AccessTokenResponse), not marked as ignorable  at [Source: java.io.ByteArrayInputStream@2e9820ae; line: 1, column: 11] (through reference chain: o rg.jboss.resteasy.skeleton.key.representations.AccessTokenResponse["token"])
        at org.codehaus.jackson.map.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyExcep tion.java:53)

REST 服务器代码

import org.jboss.resteasy.skeleton.key.representations.AccessTokenResponse;

@RequestMapping(value = "/token", method = RequestMethod.POST)
public @ResponseBody AccessTokenResponse getToken(@RequestBody String requestBody)
{
  System.out.println("Request Body received:\n" + requestBody);

  AccessTokenResponse response = new AccessTokenResponse();
  response.setToken("2YotnFZFEjr1zCsicMWpAA");
  response.setTokenType("example");
  response.setExpiresIn(3600L);
  response.setRefreshToken("YES");

  return response;
}

类被序列化

package org.jboss.resteasy.skeleton.key.representations;

public class AccessTokenResponse
{
  @JsonProperty("access_token")
  protected String token;

  ...

  public String getToken()
  {
    return token;
  }
  ...
}

【问题讨论】:

    标签: java json spring rest


    【解决方案1】:

    您可以在 getToken 方法上设置属性名称,spring 会使用它:

      protected String token;
    
      ...
      @JsonProperty("access_token")
      public String getToken()
      {
        return token;
      }
    

    【讨论】:

    • 我想我可以用我自己的应用程序的类来做到这一点,但这里使用的类是 JBoss 库中的现有类。能够在不修改库提供的类的情况下获得结果会很好。另外,我希望在序列化/反序列化期间行为保持一致。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 2014-01-04
    相关资源
    最近更新 更多