像@jsonunwrapped一样的moshi序列化支持

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了像@jsonunwrapped一样的moshi序列化支持相关的知识,希望对你有一定的参考价值。

我有一个像这样的POJO:

class Registration {
    String name;

    @JsonUnwrapped
    ModifiableDetails detailsToModify;
}

class ModifiableDetails {
    String currentStatus;
    int enrollmentNumber;
}

当我用内容发出休息请求时

{ "name":"Lucy", "currentStatus":"active","enrollmentNumber":001}

Spring RestController将其反序列化为注册POJO,因为它使用Jackson进行反序列化。之后,当我再次使用Moshi适配器序列化对象时,我得到一个像这样的json:

{
 "name":"Lucy", 
 "detailsToModify":{
     "currentStatus":"active",
     "enrollmentNumber":001
  }
}

是否有可能与Moshi序列化对象,如:

{ "name":"Lucy", "currentStatus":"active","enrollmentNumber":001}

或者是否有其他JsonAdapter(杰克逊除外)可用于序列化对象?

提前致谢

答案

最快的方法是使用中间类型的一次性JsonAdapter。

final class RegistrationJson {
  static final Object ADAPTER = new Object() {
    @FromJson Registration fromJson(RegistrationJson json) {
      return new Registration(json.name,
          new ModifiableDetails(json.currentStatus, json.enrollmentNumber));
    }

    @ToJson RegistrationJson toJson(Registration registration) {
      return new RegistrationJson(registration.name, registration.detailsToModify.currentStatus,
          registration.detailsToModify.enrollmentNumber);
    }
  };

  final String name;
  final String currentStatus;
  final int enrollmentNumber;

  RegistrationJson(String name, String currentStatus, int enrollmentNumber) {
    this.name = name;
    this.currentStatus = currentStatus;
    this.enrollmentNumber = enrollmentNumber;
  }
}

将它注册到您的Moshi实例,您可以运行以下命令。

Moshi moshi = new Moshi.Builder().add(RegistrationJson.ADAPTER).build();
JsonAdapter<Registration> adapter = moshi.adapter(Registration.class);
Registration registration = adapter.fromJson("{ "name":"Lucy", "currentStatus":"active","enrollmentNumber":1}");
String json = adapter.toJson(registration);

请注意,001是无效的JSON。

以上是关于像@jsonunwrapped一样的moshi序列化支持的主要内容,如果未能解决你的问题,请参考以下文章

使用 Moshi 反序列化可以是两种数据类型之一的字段

Moshi 通用类型适配器

用 Moshi 序列化密封类

Moshi 1.9.x 无法序列化 Kotlin 类型

在 moshi 中使用自定义 MapAdapter 序列化地图

Moshi 无法将 0、1 反序列化为“布尔值?”