Обертка как струна в Джексоне

Как я могу Джексон сериализовать тип оболочки для строки и из строки?

Я слил следующее из двух разных примеров их веб-сайта. Но тип HostName сериализуется / десериализуется как

{ "name" : "my.host.name.com" }

когда я хочу, чтобы это была просто строка

"my.host.name.com"

Обратите внимание, что у меня много типов XName, поэтому я использую оболочку Immutables. Поэтому я бы предпочел решение, которое уменьшает количество котельной плиты.


@Value.Immutable @AbstractName.Wrapper
public abstract class _HostName extends AbstractName { }

...

public abstract class AbstractName {

    @JsonSerialize
    @JsonDeserialize
    @Value.Style(
        // Detect names starting with underscore
        typeAbstract = "_*",
        // Generate without any suffix, just raw detected name
        typeImmutable = "*",
        // Make generated public, leave underscored as package private
        visibility = Value.Style.ImplementationVisibility.PUBLIC,
        // Seems unnecessary to have builder or superfluous copy method
        defaults = @Value.Immutable(builder = false, copy = false))
    public @interface Wrapper {}




    @Value.Parameter
    public abstract String name();

    @Override
    public String toString() { return name(); }
}

1 ответ

Решение

У меня это работает, как показано ниже. На моих типах имен есть дополнительная аннотация. Это не мой любимый, но это работает.

@JsonDeserialize(as=HostName.class)
@Value.Immutable @AbstractName.Wrapper
public abstract class _HostName extends AbstractName { }

...

public abstract class AbstractName {

    @Value.Style(
        // Detect names starting with underscore
        typeAbstract = "_*",
        // Generate without any suffix, just raw detected name
        typeImmutable = "*",
        // Make generated public, leave underscored as package private
        visibility = Value.Style.ImplementationVisibility.PUBLIC,
        // Seems unnecessary to have builder or superfluous copy method
        defaults = @Value.Immutable(builder = false, copy = false))
    public @interface Wrapper {}


    @JsonValue
    @Value.Parameter
    public abstract String name();

    @Override
    public String toString() { return name(); }
}

Вот небольшая программа для его запуска:

public static void main(String... args) throws IOException {
    ObjectMapper json = new ObjectMapper();

    String text = json.writeValueAsString(HostName.of("my.host.name.com"));

    System.out.println(text);

    HostName hostName = json.readValue(text, HostName.class);
    System.out.println(hostName);
}
Другие вопросы по тегам