【问题标题】:How does Gson serialize and deserialize inherited POJOs generated by Lombok?Gson如何序列化和反序列化Lombok生成的继承POJO?
【发布时间】:2021-01-30 09:20:42
【问题描述】:

如何将 Java 继承与 lombokfinal(不可变数据类型)和 Gson 一起使用?


@ToString
@Getter
@EqualsAndHashCode(callSuper = false)
public abstract class AbstractContext {
  protected final String applicationUuid;
  protected final String userUuid;
  protected final String accountUuid;

  public AbstractContext(
      String applicationUuid, String userUuid, String accountUuid) {
    this.applicationUuid = applicationUuid;
    this.accountUuid = accountUuid;
    this.userUuid = userUuid;
  }

@ToString
@Getter
@EqualsAndHashCode(callSuper = true)
public class ChildContext extends AbstractContext {
  private final String foobar;

  public ChildContext(
      String applicationUuid, String userUuid, String accountUuid, String foobar) {
    super(applicationUuid, userUuid, accountUuid);
    this.foobar = foobar;
  }
}

Gson gson = new Gson();
ChildContext inputB =
        gson.fromJson(
            "{\"application_uuid\":\"deadbeef\",\"user_uuid\":\"aaabbb_4958\",\"foobar\":\"abc\"}",
            ChildContext.class);

但是,我得到的结果是其他父类字段为 null

foobar=abc, application_uuid=null, user_uuid=null, account_uuid=null

我试图研究使用 lombok 中的 SuperBuilder,但结果仍然相同

【问题讨论】:

  • 您为什么认为 JSON 字段 application_uuid 会映射到 Java 字段 applicationUuid?它们是不同的名称。

标签: java spring gson lombok


【解决方案1】:

您忘记指定字段命名策略。

Gson gson = new GsonBuilder()
        .setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
        .create();
ChildContext inputB =
        gson.fromJson(
            "{\"application_uuid\":\"deadbeef\",\"user_uuid\":\"aaabbb_4958\",\"foobar\":\"abc\"}",
            ChildContext.class);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-13
    • 2015-11-04
    相关资源
    最近更新 更多