Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中将JSON类型转换为字节数组格式_Java_Json_Byte - Fatal编程技术网

在java中将JSON类型转换为字节数组格式

在java中将JSON类型转换为字节数组格式,java,json,byte,Java,Json,Byte,当我想在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

当我想在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对象转换为字节,有什么建议吗

获取字符串的字节数:

obj.toString().getBytes(theCharset);

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

sendData = obj.toString().getBytes("utf-8");

为了避免从
String
byte[]
的不必要的转换,这会强制基于提供的字符集进行编码,我更喜欢直接使用
JsonWriter
ByteArrayOutputStream
JsonValue
子类型使用
JsonWriter
StringWriter
):

此外,还可以按如下方式启用漂亮打印:

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

唯一可悲的是,它不是一行。您至少需要3个(考虑到您忽略了调用
JsonWriter.close()
,这在本上下文中是不必要的)。

使用
jackson-databind
项目的
ObjectMapper
中的实用程序类,即
ObjectMapper.writeValueAsBytes(dto)
返回
字节[]

@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>

com.fasterxml.jackson.core
杰克逊数据绑定
2.8.8.1

getBytes
应该传递一个编码。否则。。。如果不是假定的“默认编码”,那就没什么意思了。请查看下面的回答,了解如何避免不必要地转换为
字符串
,以及基于提供的字符集的附加编码:JSONObject和a字符串都是不同的数据表示形式。我们在记事本中看到的是JSON数据的字符串表示,而不是实际数据。例如,如果你在记事本中看到一个int值65535,这实际上是一个由6、5、5、3和5个字符组成的字符串(java中5个字符=5*2字节=10字节),而不是一个int值65535(java中为4字节)。是的,你也是对的…:)所以我在每个答案中都放弃了一些…:@Agung链接不再有效,你能告诉我这有什么用吗?哦!知道objectMapper后,我错过了使用它…,不过我已经更新了代码。谢谢.Json.createWriter(stream.write(obj);上面的行只接受Javax.json类型的obj,而不接受JSONObject(问题中提到)。如果您尝试像这样强制转换它:Json.createWriter(stream.write((JSONObject)obj);它抛出异常:无法强制转换。对JSONObject类型对象的任何建议。
<!-- 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>