32

I want to form a JSON with two fields mimetype and value.The value field should take byte array as its value.

{

  "mimetype":"text/plain",

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

}

How can I accomplish this task?

As of now I am using toString() method to convert the byte array into String and form the JSON.

Dreen
  • 6,128
  • 10
  • 44
  • 67
Sudhagar Sachin
  • 433
  • 2
  • 6
  • 14

3 Answers3

45

If you are using Jackson for JSON parsing, it can automatically convert byte[] to/from Base64 encoded Strings via data-binding.

Or, if you want low-level access, both JsonParser and JsonGenerator have binary access methods (writeBinary, readBinary) to do the same at level of JSON token stream.

For automatic approach, consider POJO like:

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

and to create JSON, you could do:

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

or, more commonly would write it out with:

OutputStream out = ...;
new ObjectMapper().writeValue(out, msg);
StaxMan
  • 102,903
  • 28
  • 190
  • 229
19

You can write your own CustomSerializer like this one:

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;
  }

}

This one returns an unsigned byte array representation instead of a Base64 string.

How to use it with your 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; }


}

And here is an example of it's output:

{
    "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.: This serializer is a mix of some answers that I found on StackOverflow.

user11153
  • 6,686
  • 4
  • 44
  • 45
Alberto Estrella
  • 651
  • 8
  • 18
  • Thanks, this worked for me. Also, I did some changes in ByteArraySerializer serialize() method. I need string representation of byte array. String str = new String(bytes); jgen.writeString(str); – ÖMER TAŞCI Jun 01 '18 at 08:55
3

You might want to use Base64 which converts binary data to a string. Most programming languages have implementations of base64 encoding and decoding. If you want to decode/encode in a browser, see this question.

Community
  • 1
  • 1
Dreen
  • 6,128
  • 10
  • 44
  • 67