2012-07-18 20 views
16

का उपयोग कर जेसन में एक बाइट सरणी भेजना मैं दो फ़ील्ड mimetype और value के साथ एक JSON बनाना चाहता हूं। मान फ़ील्ड बाइट सरणी को इसके मान के रूप में लेना चाहिए।जैक्सन

{ 

    "mimetype":"text/plain", 

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

} 

मैं यह कार्य कैसे पूरा कर सकता हूं?

अभी तक मैं बाइट सरणी को स्ट्रिंग में परिवर्तित करने और JSON बनाने के लिए toString() विधि का उपयोग कर रहा हूं।

उत्तर

3

आप Base64 का उपयोग करना चाहते हैं जो बाइनरी डेटा को स्ट्रिंग में परिवर्तित करता है। अधिकांश प्रोग्रामिंग भाषाओं में बेस 64 एन्कोडिंग और डिकोडिंग के कार्यान्वयन होते हैं। यदि आप किसी ब्राउज़र में डीकोड/एन्कोड करना चाहते हैं, तो this question देखें।

+1

लेकिन कृपया ध्यान रखें कि विभिन्न प्रकार के बेस 64 हैं। –

25

यदि आप JSON पार्सिंग के लिए जैक्सन का उपयोग कर रहे हैं, तो यह स्वचालित रूप से byte[] को बेस -64 एन्कोडेड स्ट्रिंग्स से डेटा-बाध्यकारी के माध्यम से परिवर्तित कर सकता है।

या, यदि आप निम्न स्तर की पहुंच चाहते हैं, तो JsonParser और JsonGenerator दोनों में जेएसओएन टोकन स्ट्रीम के स्तर पर बाइनरी एक्सेस विधियां (लिखना बाइनरी, रीड बाइनरी) है।

स्वचालित दृष्टिकोण के लिए, की तरह 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); 
+0

इसके लिए नमूना कोड दे सकता है ...? –

+0

बाइट [] फ़ील्ड के साथ पीओजेओ का? जवाब में जोड़ देंगे ... – StaxMan

10

आप अपना खुद का कस्टमसेरियलाइज़र इस तरह लिख सकते हैं:

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

} 

यह एक बेस 64 स्ट्रिंग के बजाय एक हस्ताक्षरित बाइट सरणी प्रस्तुतिकरण देता है।

कैसे अपने 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 
    ] 
} 

पुनश्च: यह serializer कुछ जवाब है कि मैं StackOverflow पर पाया का एक मिश्रण है ।