【问题标题】:moshi serialization support like @jsonunwrappedmoshi 序列化支持,如 @jsonunwrapped
【发布时间】:2018-08-09 08:33:23
【问题描述】:

我有一个这样的 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(Jackson 除外)可用于以这种方式序列化对象?

提前致谢

【问题讨论】:

    标签: java spring-mvc jackson moshi


    【解决方案1】:

    最快的方法是使用中间类型的一次性 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。

    【讨论】:

    • 谢谢@Eric。当然,这是一种方法。但我希望它是通用的,这样我就可以通过使用 .class 来序列化它(例如,通过在这里传递 Registration.class)
    • 通过Registration.class在哪里?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-16
    • 2019-09-19
    • 1970-01-01
    • 2019-04-03
    • 2014-01-23
    • 2013-05-10
    • 1970-01-01
    相关资源
    最近更新 更多