Отправка массива байтов в json с использованием jackson - программирование
Подтвердить что ты не робот

Отправка массива байтов в json с использованием jackson

Я хочу создать JSON с двумя полями mimetype и значением. Поле значения должно принимать байтовый массив как его значение.

{

  "mimetype":"text/plain",

  "value":"dasdsaAssadsadasd212sadasd"//this value is of type byte[]

}

Как я могу выполнить эту задачу?

В настоящее время я использую метод toString() для преобразования байтового массива в String и формирования JSON.

4b9b3361

Ответ 1

Если вы используете разбор Джексона для разбора JSON, он может автоматически преобразовывать byte[] в/из строк с кодировкой Base64 через привязку данных.

Или, если вы хотите получить низкоуровневый доступ, то как JsonParser, так и JsonGenerator имеют двоичные методы доступа (writeBinary, readBinary), чтобы сделать то же самое на уровне потока токенов JSON.

Для автоматического подхода рассмотрите POJO как:

public class Message {
  public String mimetype;
  public byte[] value;
}

и для создания JSON вы можете сделать:

Message msg = ...;
String jsonStr = new ObjectMapper().writeValueAsString(msg);

или, чаще всего, записывать его с помощью:

OutputStream out = ...;
new ObjectMapper().writeValue(out, msg);

Ответ 2

Вы можете написать свой собственный CustomSerializer следующим образом:

public class ByteArraySerializer extends JsonSerializer<byte[]> {

@Override
public void serialize(byte[] bytes, JsonGenerator jgen,
        SerializerProvider provider) throws IOException,
        JsonProcessingException {
    jgen.writeStartArray();

    for (byte b : bytes) {
        jgen.writeNumber(unsignedToBytes(b));
    }

    jgen.writeEndArray();

}

private static int unsignedToBytes(byte b) {
    return b & 0xFF;
  }

}

Это возвращает представление без строкового байта вместо строки Base64.

Как использовать его с POJO:

public class YourPojo {

    @JsonProperty("mimetype")
    private String mimetype;
    @JsonProperty("value")
    private byte[] value;



    public String getMimetype() { return this.mimetype; }
    public void setMimetype(String mimetype) { this.mimetype = mimetype; }

    @JsonSerialize(using= com.example.yourapp.ByteArraySerializer.class)
    public byte[] getValue() { return this.value; }
    public void setValue(String value) { this.value = value; }


}

И вот пример его вывода:

{
    "mimetype": "text/plain",
    "value": [
        81,
        109,
        70,
        122,
        90,
        83,
        65,
        50,
        78,
        67,
        66,
        84,
        100,
        72,
        74,
        108,
        89,
        87,
        48,
        61
    ]
}

P.S.: Этот сериализатор представляет собой смесь некоторых ответов, которые я нашел в StackOverflow.

Ответ 3

Возможно, вы захотите использовать Base64, который преобразует двоичные данные в строку. Большинство языков программирования имеют реализации кодирования и декодирования base64. Если вы хотите декодировать/кодировать в браузере, см. этот вопрос.