【问题标题】:Sending a byte array in json using jackson使用jackson在json中发送一个字节数组
【发布时间】:2012-07-18 17:22:43
【问题描述】:

我想用mimetype和value两个字段组成一个JSON。value字段应该以字节数组为值。

{

  "mimetype":"text/plain",

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

}

我怎样才能完成这项任务?

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

【问题讨论】:

    标签: json jackson


    【解决方案1】:

    如果您使用 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);
    

    【讨论】:

    • 有这方面的文档吗?这个功能还是一样的吗?我正在从弹簧引导休息控制器发送一个字节数组。那么这是否意味着它将通过杰克逊自动转换为base 64字符串?
    • 这将取决于 Spring Boot:如果它使用 Jackson 发送/接收带有 byte[] 字段的 POJO,是的。其他一些类型的数据使用不同的转换器(例如查询参数)。
    • readBinaryValue 要知道的是它希望二进制文件是 base 64 编码的,(标准 JSON)。但是,您可能会看到可能包含二进制数据的非标准 JSON 文档。
    【解决方案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 上找到的一些答案的混合体。

    【讨论】:

    • 谢谢,这对我有用。另外,我对 ByteArraySerializer serialize() 方法做了一些更改。我需要字节数组的字符串表示。字符串 str = 新字符串(字节); jgen.writeString(str);
    【解决方案3】:

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

    【讨论】:

    • 但是请注意,Base64 有很多种。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多