java - array - Coloca la matriz de bytes en JSON y viceversa
send byte array in json c# (3)
¿Es posible poner un byte[]
(matriz de bytes) en JSON
?
si es así, ¿cómo puedo hacer eso en Java? entonces lee ese JSON y convierte ese campo nuevamente a byte[]
?
¿Qué tal simplemente esto?
byte[] args2 = getByteArry();
String byteStr = new String(args2);
Aquí hay un buen ejemplo de las matrices de bytes de codificación base64. Se vuelve más complicado cuando lanzas caracteres Unicode en la mezcla para enviar cosas como documentos PDF. Después de codificar una matriz de bytes, la cadena codificada se puede usar como un valor de propiedad JSON.
Apache commons ofrece buenos servicios:
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
Ejemplo del lado del servidor de 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);
}
Decodificación de 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;
}
La forma típica de enviar archivos binarios en json es codificarla en base64.
Java proporciona diferentes formas de codificar y decodificar un byte[]
Base64 byte[]
. Uno de estos es DatatypeConverter
.
Muy simple
byte[] originalBytes = new byte[] { 1, 2, 3, 4, 5};
String base64Encoded = DatatypeConverter.printBase64Binary(originalBytes);
byte[] base64Decoded = DatatypeConverter.parseBase64Binary(base64Encoded);
Tendrá que hacer esta conversión dependiendo de la biblioteca de generador / analizador json que use.