Отключить кодировку Base64 при сериализации в Jackson ObjectMapper - PullRequest
1 голос
/ 08 мая 2019

Я использую Jackson 2.2.3. Когда я сериализую объект в JSON, все свойства byte[] кодируются в base64 в сгенерированном json.

Как это отключить?

Вот мой код.

DataHolder.java

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "expectedData"
})
@XmlRootElement(name = "dataHolder")
public class DataHolder {

    private final static long serialVersionUID = 1L;
    @XmlElement(required = true, type = String.class)
    @XmlJavaTypeAdapter(HexBinaryAdapter.class)
    @XmlSchemaType(name = "hexBinary")
    protected byte[] expectedData;

    ...

}

Вывод в формате JSON:

{
...
"dataHolder": {
    "expectedData": "c29tZXRleHQ=",
}
...
}

1 Ответ

1 голос
/ 08 мая 2019

Здесь я создаю пользовательский сериализатор:

public class BytesToStringSerializer extends StdSerializer<byte[]> {

    public BytesToStringSerializer() {
        super(byte[].class);
    }

    protected BytesToStringSerializer(Class<byte[]> t) {
        super(t);
    }

    @Override
    public void serialize(byte[] value, JsonGenerator gen, SerializerProvider provider) throws IOException {
        String yourReadableString = new String(value, StandardCharsets.UTF_8);
        gen.writeString(yourReadableString);
    }
}

Ваш DataHolder класс:

public class DataHolder {
    @JsonSerialize(using = BytesToStringSerializer.class)
    byte[] expectedData;

    public DataHolder(byte[] expectedData) {
        this.expectedData = expectedData;
    }
}

И основной класс для тестирования:

public class Main {
    public static void main(String[] args) throws JsonProcessingException {

        byte[] someBytes = "Hello world".getBytes(StandardCharsets.UTF_8);
        DataHolder dataHolder = new DataHolder(someBytes);
        ObjectMapper objectMapper = new ObjectMapper();
        String output = objectMapper.writeValueAsString(dataHolder);
        System.out.println(output);
    }
}

Вывод:

{"expectedData":"Hello world"}

Имейте в виду, что вы должны использовать кодировку, которая подходит вам.Если ваш массив byte[] не представляет ничего читабельного, вы должны сохранить его в формате base64.

РЕДАКТИРОВАТЬ:

Чтобы настроить ObjectMapper, зарегистрируйте глобально модуль сСериализатор для него:

public class Main {
    public static void main(String[] args) throws JsonProcessingException {
        byte[] someBytes = "Hello world".getBytes(StandardCharsets.UTF_8);
        DataHolder dataHolder = new DataHolder(someBytes);

        ObjectMapper objectMapper = new ObjectMapper();
        SimpleModule module = new SimpleModule();
        module.addSerializer(byte[].class, new BytesToStringSerializer());
        objectMapper.registerModule(module);

        String output = objectMapper.writeValueAsString(dataHolder);
        System.out.println(output);
    }
}

Не забудьте предоставить геттеры и сеттеры для ваших данных.Если вам не нужны методы получения и установки, настройте objectMapper и установите видимость поля:

objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
...