我尝试使用以下代码从byte[]
获取JSONObject
值,但我没有获得原始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文件并阅读其内容。
从byte[]
获取JSONObject
以便创建损坏的文件我做错了什么?请指导我。我总是欢迎发表评论。谢谢。
答案 0 :(得分:4)
最后,我在 apache commons 库的帮助下解决了我的问题。首先,我使用了以下依赖。
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.6</version>
<type>jar</type>
</dependency>
我之前使用的技术对我来说是错误的(其他人不确定)。以下是我如何解决问题的解决方案。
解决方案:
我之前在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");
那就是它。
答案 1 :(得分:0)
对于测试示例(使用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)))
;
答案 2 :(得分:0)
这可能对使用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);
答案 3 :(得分:-2)
将字节数组插入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解析为原始数据类型的方式存储它。