我想形成一个带有两个字段mimetype和value的JSON。值字段应该以字节数组作为其值。
{
"mimetype":"text/plain",
"value":"dasdsaAssadsadasd212sadasd"//this value is of type byte[]
}
我该如何完成这项任务?
截至目前,我使用toString()
方法将字节数组转换为String并形成JSON。
答案 0 :(得分:35)
如果您使用Jackson进行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);
答案 1 :(得分:14)
您可以像这样编写自己的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上找到的一些答案的混合。
答案 2 :(得分:3)
您可能希望使用Base64将二进制数据转换为字符串。大多数编程语言都具有base64编码和解码的实现。如果您想在浏览器中解码/编码,请参阅this question。