2012-07-18 13 views
16

Quiero formar un JSON con dos campos tipoM mimet y valor. El campo de valor debe tomar la matriz de bytes como su valor.Enviando una matriz de bytes en json usando jackson

{ 

    "mimetype":"text/plain", 

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

} 

¿Cómo puedo lograr esta tarea?

A partir de ahora estoy usando el método toString() para convertir la matriz de bytes en cadena y formar el JSON.

Respuesta

3

Es posible que desee utilizar Base64 que convierte datos binarios a una cadena. La mayoría de los lenguajes de programación tienen implementaciones de codificación y decodificación base64. Si desea decodificar/codificar en un navegador, consulte this question.

+1

Pero tenga en cuenta que hay varios tipos de Base64. –

25

Si está usando Jackson para el análisis JSON, puede convertir automáticamente byte[] en/desde cadenas codificadas en Base64 a través del enlace de datos.

O, si desea acceso de bajo nivel, tanto JsonParser como JsonGenerator tienen métodos de acceso binario (writeBinary, readBinary) para hacer lo mismo a nivel de la secuencia de token JSON.

Para enfoque automático, considere POJO como:

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

y crear JSON, que podría hacer:

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

o, más comúnmente se escribirían con:

OutputStream out = ...; 
new ObjectMapper().writeValue(out, msg); 
+0

puede dar código de muestra para ello ...? –

+0

De un campo POJO con byte []? Se agregará para responder ... – StaxMan

10

Puede escribir su propio CustomSerializer como este:

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

} 

Este devuelve una representación de matriz de bytes sin signo en lugar de una cadena de Base64.

Cómo se usa con su 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; } 


} 

Y aquí es un ejemplo de esto es la salida:

{ 
    "mimetype": "text/plain", 
    "value": [ 
     81, 
     109, 
     70, 
     122, 
     90, 
     83, 
     65, 
     50, 
     78, 
     67, 
     66, 
     84, 
     100, 
     72, 
     74, 
     108, 
     89, 
     87, 
     48, 
     61 
    ] 
} 

PD: Este serializador es una mezcla de algunas de las respuestas que he encontrado en StackOverflow .

Cuestiones relacionadas