使用JSONObject放置/获取字节数组值

时间:2014-10-30 10:11:14

标签: java pdf jersey bytearray

我尝试使用以下代码从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以便创建损坏的文件我做错了什么?请指导我。我总是欢迎发表评论。谢谢。

4 个答案:

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