【问题标题】:Serialize and deserialize a field according to another field value根据另一个字段值序列化和反序列化一个字段
【发布时间】:2019-04-20 22:54:47
【问题描述】:

如何根据同一类中的另一个字段值对字段进行序列化或反序列化?

在下面的例子中,当序列化或反序列化Packet 类时,我希望type 字段将确定如何 payload 字段将被序列化和反序列化。

PayloadType 枚举

public enum PayloadType {
    HTTP,
    HTTPS,
    FTP
}

包类

public class Packet {
    private final String payload;
    // This field should determine how "payload" field is serialized.
    private final PayloadType type;     
    private final Date creationTime;

@JsonCreator
public Packet(String payload, PayloadType type) {
    this.payload = payload;
    this.type = type;
    this.creationTime = new Date();
}

public String getPayload() {
    return this.payload;
}

public PayloadType getType() {
    return this.type;
}

public Date getCreationTime() {
    return this.creationTime;
}

测试

public class PacketTests {
@Test
public void packetSerialization_fromHttpType() throws JsonProcessingException {
    // Given
    ObjectMapper jackson = new ObjectMapper();
    String payload = "hello world";
    PayloadType type = PayloadType.HTTP;
    Packet packet = new Packet(payload, type);
    String json;

    // When
    json = jackson.writeValueAsString(packet);

    // Then
    System.out.println(json);
}

电流输出

{"payload":"hello world","type":"HTTP","creationTime":1542538836041}

预期产出

{"payload":"(http) hello world","type":"HTTP","creationTime":1542538836041}
{"payload":"(https) hello world","type":"HTTPS","creationTime":1542538836041}
{"payload":"X9hnahj83","type":"FTP","creationTime":1542538836041}

FTPpayload 是 base64 字符串。

【问题讨论】:

  • 你需要一个custom seralizer 和一个custom deseralizer
  • @guleryuz 你说得对,但我没有找到任何直接的方法来使用自定义序列化器和反序列化器。
  • 一种更简单的方法可能是在Packet 类中放置一个新方法,例如public String getPayloadLong() { return "(" + getType().name().toLowerCase() + ") " + getPayload(); },然后您将在json 中看到一个名为payloadLong 的新字段。这样你就不需要custom (de)seralizers
  • @guleryuz 我写的代码只是一个例子,所以,作为另一个例子,考虑 FTP 类型的 payload 是字符串基 64 字节数组。

标签: java android json jackson jackson-databind


【解决方案1】:

类似于@comment 更新payload getter 以返回不同的输出值

 public String getPayload() {
     return "(" + getType().name().toLowerCase() + ") " +  this.payload;
 }

【讨论】:

  • 查看我的comment for @guleryu,我还更新了问题中的预期结果(特别是FTP 类型)
  • @Eido95 你可以自己做,不是吗?
  • 作为一种解决方法,我确实可以自己做,但这就是为什么我要问,是否可以使用 Jackson 来做 - 也许不是。
猜你喜欢
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2015-09-01
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多