Сериализация JsonView, которая зависит от некоторых условий / имени свойства и т. Д. - PullRequest
0 голосов
/ 25 апреля 2020

Один из моих классов имеет 3 свойства одного типа. Сейчас я пытаюсь сериализовать его, выполняя JSON, но одно из этих свойств нужно сериализовать по-другому - в основном одно из этих свойств является «внутренним», и мне нужен только его идентификатор, остальные должны быть полностью сериализованы.

Что я дошел до сих пор:

@NoArgsConstructor @AllArgsConstructor @Data
public static class Id {
    @JsonView(View.IdOnly.class) private long id;
}

@NoArgsConstructor @AllArgsConstructor @Data
public static class Company extends Id {
    @JsonView(View.Tx.class) private String name;
    @JsonView(View.Tx.class) private String address;
}

@NoArgsConstructor @AllArgsConstructor @Data
public static class Transaction {
    @JsonView(View.Tx.class)     private Company from;
    @JsonView(View.Tx.class)     private Company to;
    @JsonView(View.IdOnly.class) private Company createdBy;
}

public static class View {
    public interface Tx extends IdOnly {}
    public interface IdOnly {}
}

И быстрый тест для него:

@Test
void test() throws JsonProcessingException {
    Company s = new Company("Source", "address_from");
    Company d = new Company("Destination", "address_to");
    final Transaction t = new Transaction(s, d, s);

    final ObjectMapper m = new ObjectMapper();
    System.out.println(m.writerWithDefaultPrettyPrinter().withView(View.Tx.class).writeValueAsString(t));
}

И вывод:

{
  "from" : {
    "id" : 0,
    "name" : "Source",
    "address" : "address_from"
  },
  "to" : {
    "id" : 0,
    "name" : "Destination",
    "address" : "address_to"
  },
  "createdBy" : {
    "id" : 0,
    "name" : "Source",
    "address" : "address_from"
  }
}

Сейчас вопрос, как настроить сериализацию свойства createBy? Мне нужен следующий вывод:

{
  "from" : {
    "id" : 0,
    "name" : "Source",
    "address" : "address_from"
  },
  "to" : {
    "id" : 0,
    "name" : "Destination",
    "address" : "address_to"
  },
  "createdBy" : {
    "id" : 0,
  }
}

1 Ответ

0 голосов
/ 25 апреля 2020

О, я думаю, что ответ на этот вопрос очень прост:

  1. Отметьте createdBy поле с @JsonSerialize(using = CS.class)
  2. Реализуйте пользовательский сериализатор следующим образом:
    public static class CS extends JsonSerializer<Company> {
        @Override
        public void serialize(Company company, JsonGenerator jgen, SerializerProvider serializerProvider) throws IOException {
            jgen.writeStartObject();
            jgen.writeNumberField("id", company.getId());
            jgen.writeEndObject();
        }
    }
...