使用JSONObject放置/获取字节数组值
我尝试使用以下代码从JSONObject
获取我的byte[]
值,但我没有获得原始byte[]
值。
JSONArray jSONArray = jSONObject.getJSONArray(JSONConstant.BYTE_ARRAY_LIST); int len = jSONArray.length(); for (int i = 0; i < len; i++) { byte[] b = jSONArray.get(i).toString().getBytes(); //Following line creates pdf file of this byte arry "b" FileCreator.createPDF(b, "test PDF From Web Resource.pdf"); } }
上面的代码创建pdf文件,但文件无法打开即损坏的文件。 当我使用相同的类和方法来创建文件时:
FileCreator.createPDF(b, "test PDF From Web Resource.pdf");
在添加到JSONObject
之前,如下所示:
JSONObject jSONObject = new JSONObject(); jSONObject.put(JSONConstant.BYTE_ARRAY_LIST, bList);
它创建文件,即我可以打开pdf文件并阅读其内容。
从JSONObject
获取byte[]
以便创建损坏的文件我做错了什么? 请指导我。 我总是欢迎发表评论。 谢谢。
最后,我在apache commons库的帮助下解决了我的问题。 首先,我使用了以下依赖。
commons-codec commons-codec 1.6 jar
我之前使用的技术对我来说是错误的(对其他人不确定) 。 以下是我如何解决问题的解决方案。
解:
我之前在JSONObject上添加了字节数组值并存储为String。 当我试图从JSONObject到我的字节数组时,它返回String而不是我的原始字节数组。 并没有得到原始的字节数组,即使我使用以下:
byte[] bArray=jSONObject.getString(key).toString().getBytes();
现在,
首先,我将我的字节数组编码为字符串,并将JSONObject保存到该编码字符串。 见下文:
byte[] bArray=(myByteArray); //Following is the code that encoded my byte array and kept on String String encodedString = org.apache.commons.codec.binary.Base64.encodeBase64String(bArray); jSONObject.put(JSONConstant.BYTE_ARRAY_LIST , encodedString);
我收回原始字节数组的代码:
String getBackEncodedString = jSONObject.getString(JSONConstant.BYTE_ARRAY_LIST); //Following code decodes to encodedString and returns original byte array byte[] backByte = org.apache.commons.codec.binary.Base64.decodeBase64(getBackEncodedString); //Creating pdf file of this backByte FileCreator.createPDF(backByte, "fileAfterJSONObject.pdf");
而已。
对于测试示例(使用com.fasterxml.jackson):
byte[] bytes = "pdf_report".getBytes("UTF-8"); Mockito.when(reportService.createPackageInvoice(Mockito.any(String.class))).thenReturn(bytes); String jStr = new ObjectMapper().writeValueAsString(bytes).replaceAll("\\\"", ""); // return string with a '\"' escape... mockMvc.perform(get("/api/getReport").param("someparam", "222")) .andExpect(status().isOk()) .andExpect(content().contentType(APPLICATION_JSON_UTF8)) ... .andExpect(jsonPath("$.content", is(jStr))) ;
这可能对使用Java 8的人有所帮助。使用java.util.Base64
。
将字节数组编码为String:
String encodedString = java.util.Base64.getEncoder().encodeToString(byteArray); JSONObject.put("encodedString",encodedString);
从String解码字节数组:
String encodedString = (String) JSONObject.get("encodedString"); byte[] byteArray = java.util.Base64.getDecoder().decode(encodedString);
将字节数组插入JSONObject时,将调用toString()方法。
public static void main(String... args) throws JSONException{ JSONObject o = new JSONObject(); byte[] b = "hello".getBytes(); o.put("A", b); System.out.println(o.get("A")); }
输出示例:
[B@1bd8c6e
所以你必须以一种可以将String解析为原始数据类型的方式存储它。