Преобразовать формат JSON в байтовый массив в java

У меня проблема, когда я хочу отправлять данные с использованием формата байтов в 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-объект в байт, любое предложение?

Ответы

Ответ 1

Получить байты строки:

obj.toString().getBytes(theCharset);

Ответ 2

Предполагая, что упоминаемый JSONObject относится к this, вы можете получить байты, как показано ниже

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

Ответ 3

Чтобы избежать ненужного преобразования из String в byte[], который применяет кодировку на основе предоставленной кодировки, я предпочитаю использовать JsonWriter непосредственно с ByteArrayOutputStream например (подтипы JsonValue используют JsonWriter с 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(), который не нужен в этом контексте).

Ответ 4

Использовать класс утилиты из ObjectMapper проекта jackson-databind, т.е. objectMapper.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>