Отправка массива байтов в json с использованием jackson
Я хочу создать JSON с двумя полями mimetype и значением. Поле значения должно принимать байтовый массив как его значение.
{
"mimetype":"text/plain",
"value":"dasdsaAssadsadasd212sadasd"//this value is of type byte[]
}
Как я могу выполнить эту задачу?
В настоящее время я использую метод toString()
для преобразования байтового массива в String и формирования JSON.
Ответы
Ответ 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. Если вы хотите декодировать/кодировать в браузере, см. этот вопрос.