web-dev-qa-db-fra.com

convertir le type JSON au format de tableau d'octets en java

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?

25
viyancs

Obtenez les octets de la chaîne:

obj.toString().getBytes(theCharset);
34
MByD

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");
30
Agung Pratama

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).

4
Stepan Vavra

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>
2
Míra