我想开发restful服务,它会将JSON String返回给客户端。现在我的对象中有byte []属性。
我使用ObjectMapper将此对象转换为json并响应客户端。 但是如果我使用 String.getBytes()来翻译收到的字符串,我发现byte []是错误的。以下是示例。
Pojo课程
public class Pojo {
private byte[] pic;
private String id;
//getter, setter,...etc
}
准备数据:使用image获取字节数组
InputStream inputStream = FileUtils.openInputStream(new File("config/images.jpg"));
byte[] pic = IOUtils.toByteArray(inputStream);
Pojo pojo = new Pojo();
pojo.setId("1");
pojo.setPic(pic);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(pojo);
- 情况1:对read =使用readvalue => image2.jpg是正确的
Pojo tranPojo = mapper.readValue(json, Pojo.class);
byte[] tranPicPojo = tranPojo.getPic();
InputStream isPojo = new ByteArrayInputStream(tranPicPojo);
File tranFilePojo = new File("config/images2.png");
FileUtils.copyInputStreamToFile(isPojo, tranFilePojo);
- 情况2:使用readvalue来映射并获取String => image3.jpg坏了
Map<String, String> map = mapper.readValue(json, Map.class);
byte[] tranString = map.get("pic").getBytes();
InputStream isString = new ByteArrayInputStream(tranString);
File tranFileString = new File("config/images3.png");
FileUtils.copyInputStreamToFile(isString, tranFileString);
如果我必须使用情境2来翻译JSON字符串,我该怎么办?因为客户端无法获取Pojo.class,所以客户端只能自己翻译JSON字符串。
非常感谢!
答案 0 :(得分:3)
ObjectMapper
处理此问题,通过单元测试表达:
@Test
public void byteArrayToAndFromJson() throws IOException {
final byte[] bytes = { 1, 2, 3, 4, 5 };
final ObjectMapper objectMapper = new ObjectMapper();
final byte[] jsoned = objectMapper.readValue(objectMapper.writeValueAsString(bytes), byte[].class);
assertArrayEquals(bytes, jsoned);
}
这是杰克逊2.x顺便说一句..
以下是使用Jersey发送文件到浏览器的方法:
@GET
@Path("/documentFile")
@Produces("image/jpg")
public Response getFile() {
final byte[] yourByteArray = ...;
final String yourFileName = ...;
return Response.ok(yourByteArray)
.header("Content-Disposition", "inline; filename=\"" + yourFilename + "\";")
.build();
另一个例子,使用Spring MVC:
@RequestMapping(method = RequestMethod.GET)
public void getFile(final HttpServletResponse response) {
final InputStream yourByteArrayAsStream = ...;
final String yourFileName = ...;
response.setContentType("image/jpg");
try {
output = response.getOutputStream();
IOUtils.copy(yourByteArrayAsStream, output);
} finally {
IOUtils.closeQuietly(yourByteArrayAsStream);
IOUtils.closeQuietly(output);
}
}
答案 1 :(得分:3)
杰克逊将byte[]
序列化为Base64字符串,如the documentation of the serializer中所述。
默认的base64变体是MIME without line feed(一行中的所有内容)。
您可以使用ObjectMapper
上的setBae64Varient
更改变体。