38

当我想在 UDP 协议中使用字节格式发送数据时遇到问题,问题是当我尝试创建类型为 json 对象的数据时,我无法获取数据的字节格式,这是我的示例代码:

    JSONObject obj = new JSONObject();
    obj.put("name", "foo");
    obj.put("num", new Integer(100));
    obj.put("balance", new Double(1000.21));
    obj.put("is_vip", new Boolean(true));
    obj.put("nickname",null);

    sendData = obj.getBytes(); //this is error because not have methos getBytes();

我知道我的问题,但我找不到如何将 json 对象转换为字节,有什么建议吗?

4

4 回答 4

48

获取字符串的字节数:

obj.toString().getBytes(theCharset);
于 2012-04-11T04:29:02.307 回答
33

假设您提到的 JSONObject 来自this,您可以获得如下所示的字节

sendData = obj.toString().getBytes("utf-8");
于 2012-04-11T04:31:14.870 回答
3

为了避免不必要的转换 from whichString根据byte[]提供的charset强制编码,我更喜欢JsonWriter直接使用 withByteArrayOutputStream例如(JsonValue子类型使用JsonWriterwith StringWriter):

ByteArrayOutputStream stream = new ByteArrayOutputStream();
Json.createWriter(stream).write(obj);

byte[] sendData = stream.toByteArray()

System.out.println("Bytes array: " + sendData);
System.out.println("As a string: " + stream.toString());

此外,甚至可以启用漂亮的打印,如下所示:

Json.createWriterFactory(
            Collections.singletonMap(JsonGenerator.PRETTY_PRINTING, true))
        .createWriter(stream)
        .write(obj);

唯一可悲的是,它不是单行的。您至少需要 3 个(考虑到您省略JsonWriter.close()了在这种情况下不必要的调用)。

于 2016-09-09T12:59:22.527 回答
3

使用项目的实用程序类ObjectMapperjackson-databindobjectMapper.writeValueAsBytes(dto)返回byte[]

@Autowired
private ObjectMapper objectMapper;

ContractFilterDTO filter = new ContractFilterDTO();
    mockMvc.perform(post("/api/customer/{ico}", "44077866")
            .contentType(MediaType.APPLICATION_JSON_UTF8_VALUE)
            .content(objectMapper.writeValueAsBytes(filter)))...

Maven依赖:

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.8.8.1</version>
</dependency>
于 2017-04-27T14:25:40.943 回答