2013-12-20 74 views
31

是否可以將byte[](字節數組)放到JSON將字節數組放到JSON中,反之亦然

如果是這樣,我怎麼能在java中做到這一點?然後閱讀該JSON並將該字段再次轉換爲byte[]

+7

JSON不支持。使用Base64。它確實有 – SLaks

+0

。我用這個:jsonObj.put(byte []); –

回答

41

這是base64編碼字節數組的一個很好的例子。當你在混合中丟棄unicode字符來發送諸如PDF文檔之類的東西時,它會變得更加複雜。編碼字節數組後,編碼後的字符串可以用作JSON屬性值。

阿帕奇百科全書提供了良好的工具:

byte[] bytes = getByteArr(); 
String base64String = Base64.encodeBase64String(bytes); 
byte[] backToBytes = Base64.decodeBase64(base64String); 

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Base64_encoding_and_decoding

Java服務器端例如:

public String getUnsecureContentBase64(String url) 
     throws ClientProtocolException, IOException { 

      //getUnsecureContent will generate some byte[] 
    byte[] result = getUnsecureContent(url); 

      // use apache org.apache.commons.codec.binary.Base64 
      // if you're sending back as a http request result you may have to 
      // org.apache.commons.httpclient.util.URIUtil.encodeQuery 
    return Base64.encodeBase64String(result); 
} 

JavaScript的解碼:

//decode URL encoding if encoded before returning result 
var uriEncodedString = decodeURIComponent(response); 

var byteArr = base64DecToArr(uriEncodedString); 

//from mozilla 
function b64ToUint6 (nChr) { 

    return nChr > 64 && nChr < 91 ? 
     nChr - 65 
    : nChr > 96 && nChr < 123 ? 
     nChr - 71 
    : nChr > 47 && nChr < 58 ? 
     nChr + 4 
    : nChr === 43 ? 
     62 
    : nChr === 47 ? 
     63 
    : 
     0; 

} 

function base64DecToArr (sBase64, nBlocksSize) { 

    var 
    sB64Enc = sBase64.replace(/[^A-Za-z0-9\+\/]/g, ""), nInLen = sB64Enc.length, 
    nOutLen = nBlocksSize ? Math.ceil((nInLen * 3 + 1 >> 2)/nBlocksSize) * nBlocksSize : nInLen * 3 + 1 >> 2, taBytes = new Uint8Array(nOutLen); 

    for (var nMod3, nMod4, nUint24 = 0, nOutIdx = 0, nInIdx = 0; nInIdx < nInLen; nInIdx++) { 
    nMod4 = nInIdx & 3; 
    nUint24 |= b64ToUint6(sB64Enc.charCodeAt(nInIdx)) << 18 - 6 * nMod4; 
    if (nMod4 === 3 || nInLen - nInIdx === 1) { 
     for (nMod3 = 0; nMod3 < 3 && nOutIdx < nOutLen; nMod3++, nOutIdx++) { 
     taBytes[nOutIdx] = nUint24 >>> (16 >>> nMod3 & 24) & 255; 
     } 
     nUint24 = 0; 

    } 
    } 

    return taBytes; 
} 
+0

Base64 is sllllloooooooooooo ..... – Pacerier

6

在json中發送二進制文件的典型方法是對base64進行編碼。

Java提供了不同的方式來Base64編碼和解碼byte[]。其中之一是DatatypeConverter

很簡單

byte[] originalBytes = new byte[] { 1, 2, 3, 4, 5}; 
String base64Encoded = DatatypeConverter.printBase64Binary(originalBytes); 
byte[] base64Decoded = DatatypeConverter.parseBase64Binary(base64Encoded); 

你必須進行這種轉換取決於你使用JSON解析器/發電機庫。

-3

WHA t大概是這樣的:

byte[] args2 = getByteArry(); 
String byteStr = new String(args2); 
+3

String(byte [])構造函數會將它編碼爲應用默認編碼的字符串。這可能會改變原始字節內容。另外,另一方面,應該清楚你正在使用哪種編碼。 – fcracker79

相關問題