2012-07-18 19 views
16

Chcę utworzyć JSON z dwoma polami typu i klasy MIME. Pole wartości powinno przyjmować tablicę bajtów jako jej wartość.Wysyłanie tablicy bajtów w jsonie przy użyciu jacksona

{ 

    "mimetype":"text/plain", 

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

} 

Jak mogę wykonać to zadanie?

Do tej pory używam metody toString() do zamiany tablicy bajtów na String i utworzenia JSON.

Odpowiedz

3

Być może zechcesz użyć Base64, który konwertuje dane binarne na ciąg znaków. Większość języków programowania ma implementacje kodowania i dekodowania base64. Jeśli chcesz dekodować/kodować w przeglądarce, zobacz this question.

+1

Należy jednak pamiętać, że istnieją różne rodzaje Base64. –

25

Jeśli używasz Jackson do parsowania JSON, może on automatycznie konwertować byte[] na/z kodowanych przez Base64 łańcuchów znaków poprzez wiązanie danych.

Lub, jeśli chcesz mieć dostęp na niskim poziomie, zarówno JsonParser, jak i JsonGenerator mają metody dostępu binarnego (writeBinary, readBinary), aby zrobić to samo na poziomie strumienia tokenów JSON.

Dla automatycznego podejścia, należy rozważyć POJO jak:

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

i stworzyć JSON, można zrobić:

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

lub bardziej powszechnie byłoby napisać go z:

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

może podać przykładowy kod ...? –

+0

O polu POJO z bajtem []? Dodam do odpowiedzi ... – StaxMan

10

Możesz napisać swój własny CustomSerializer, taki jak ten:

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

} 

Ten zwraca niepisaną reprezentację tablicy bajtów zamiast łańcucha Base64.

Jak korzystać z 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; } 


} 

i tutaj jest przykładem, że to wyjście:

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

PS: Ten serializer jest mieszanką kilku odpowiedzi, które znalazłem na StackOverflow .

Powiązane problemy