2012-04-11 3 views
16

У меня проблема с отправкой данных с использованием формата байтов в UDP-протоколе, проблема в том, что когда я пытаюсь создать данные с помощью типа json-объекта, я не могу получить байтовый формат моих данных это мой пример кода:преобразовать формат массива JSON в байтовый массив в java

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 в байте, любое предложение?

ответ

26

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

obj.toString().getBytes(theCharset); 
+2

'getBytes' должен быть принят кодировку. В противном случае ... не весело, если это не предполагаемая «кодировка по умолчанию». –

+0

@pst - хорошая точка, спасибо. – MByD

+0

Да, вы правы, спасибо за ваш ответ .. :) – viyancs

24

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

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

да, вы тоже правы ... :) поэтому я даю немного в каждом ответе ... :) – viyancs

+0

@Agung ссылка уже недействительна, можете ли вы сказать, что использовать, если это так? –

2

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

0

Использование утилиты класса от 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> 
Смежные вопросы