Как использовать @JsonConverter с Genson? - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь сериализовать объект с длинным идентификатором в JSON, используя Genson.

Хорошо работает, если я сериализую в JSON и вернусь в Java.Но я десериализирую в JavaScript.

JavaScript не может поддерживать полное 64-битное без знака int в виде числа (я обнаружил, что последние несколько бит моего идентификатора обнуляютсяв JavaScript), поэтому мне нужно преобразовать длинный идентификатор в строку во время сериализации.

Я не хочу преобразовывать все длинные в объекте, поэтому я пытаюсь использовать конвертер только дляполе id.

import com.owlike.genson.annotation.JsonConverter;
import javax.persistence.Id;
import lombok.Getter;
import lombok.Setter;

...

/** the local database ID for this order */
@JsonConverter(LongToStringConverter.class)
@Id       
@Setter
@Getter
private Long id;

/** The unique ID provided by the client */
@Setter
@Getter
private Long clientKey; 

Мой код конвертера выглядит следующим образом:

public class LongToStringConverter implements Converter<Long> {

    /** Default no-arg constructor required by Genson */
    public LongToStringConverter() {        
    }

    @Override
    public Long deserialize(ObjectReader reader, Context ctx) {
        return reader.valueAsLong();
    }

    @Override
    public void serialize(Long obj, ObjectWriter writer, Context ctx) {
        if (obj != null) {
            writer.writeString(obj.toString());
        }
    }
}

Я не делаю ничего особенного при вызове самой сериализации:

    Genson genson = new GensonBuilder().useIndentation(true).create();
    String json = genson.serialize( order );

Thisне работаетВывод по-прежнему выглядит следующим образом:

{
  "clientKey":9923001278,
  "id":1040012110000000002
}

Я пытаюсь добиться следующего:

{
  "clientKey":9923001278,
  "id":"1040012110000000002"   // value is quoted
}

Я также пытался передать свой конвертер в GensonBuilder, но он ударил по всемДолго в объекте, а это не то, что мне нужно.

Любой совет?

1 Ответ

1 голос
/ 16 апреля 2019

Ну, я не совсем понимаю, ПОЧЕМУ, но похоже, что Генсону просто не дают аннотацию. Это может быть связано с использованием Hibernate или Lombok.

Решение, похоже, состоит в том, чтобы заставить Генсона рассмотреть аннотированное поле.

Я сделал это с помощью GensonBuilder:

Genson genson = new GensonBuilder().useIndentation(true).include("id").create();
String json = genson.serialize( order );

EDIT: Включая ответ Eugen выше, это также работает, потому что он дает указание Genson смотреть на приватное поле вместо того, чтобы полагаться на получателя / установщика:

Genson genson2 = new GensonBuilder().useFields(true, VisibilityFilter.PRIVATE).useMethods(true).create();
...