使用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解析为原始数据类型的方式存储它。