使用Jackson将字节数组以JSON格式发送

35

我想要创建一个包含两个字段mimetype和value的JSON。其中value字段应该将字节数组作为其值。

{

  "mimetype":"text/plain",

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

}

我该如何完成这个任务?

目前我正在使用toString()方法将字节数组转换为字符串并形成JSON。

3个回答

47
如果你正在使用Jackson进行JSON解析,它可以通过数据绑定自动将byte[]转换为Base64编码的字符串并进行相互转换。
或者,如果你想要底层访问,JsonParserJsonGenerator都具有二进制访问方法(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
这个有文档吗?这个功能还是一样的吗?我正在从Spring Boot Rest Controller发送一个字节数组。那么这是否意味着它会通过Jackson自动转换为Base64字符串? - Lakindu Hewawasam
这取决于Spring Boot:如果它使用Jackson来发送/接收带有byte[]字段的POJO,则可以。其他类型的数据使用不同的转换器(例如查询参数)。 - StaxMan
1
需要了解的是,readBinaryValue 函数期望二进制数据以 base64 编码(标准 JSON)的形式传入。但是在实际情况中,我们可能会遇到非标准的 JSON 文档,其中包含二进制数据。 - bric3

20

你可以像这样编写自己的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上找到的答案的混合体。


谢谢,这对我有用。此外,我在ByteArraySerializer serialize()方法中进行了一些更改。我需要字节数组的字符串表示形式。 String str = new String(bytes); jgen.writeString(str); - ÖMER TAŞCI

3
您可能希望使用将二进制数据转换为字符串的Base64。大多数编程语言都有base64编码和解码实现。如果您想在浏览器中解码/编码,请参见此问题

1
但请注意,有各种不同类型的Base64。 - Hans-Peter Störr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接