J'ai un problème quand je veux envoyer des données en utilisant le format d'octet dans le protocole UDP, le problème est quand j'essaye de créer des données avec le type d'objet json, je ne peux pas obtenir le format d'octet de mes données c'est mon exemple de code:
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();
je connais mon problème mais je ne trouve pas comment convertir un objet json en octet, une suggestion?
Obtenez les octets de la chaîne:
obj.toString().getBytes(theCharset);
En supposant que le JSONObject que vous mentionnez est de this , vous pouvez obtenir les octets comme ci-dessous
sendData = obj.toString().getBytes("utf-8");
Pour éviter une conversion inutile de String
vers byte[]
Qui applique un codage basé sur le charset fourni, je préfère utiliser JsonWriter
directement avec ByteArrayOutputStream
par exemple (JsonValue
les sous-types utilisent JsonWriter
avec 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());
De plus, on peut même activer jolie impression comme suit:
Json.createWriterFactory(
Collections.singletonMap(JsonGenerator.PRETTY_PRINTING, true))
.createWriter(stream)
.write(obj);
La seule chose triste, c'est que ce n'est pas un one-liner. Vous auriez besoin de 3 au moins (étant donné que vous omettez d'appeler JsonWriter.close()
ce qui n'est pas nécessaire dans ce contexte).
Utilisez la classe utilitaire de ObjectMapper
du projet jackson-databind
, C'est-à-dire que objectMapper.writeValueAsBytes(dto)
renvoie 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)))...
Dépendance 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>