/ / Utilizzo di Jackon ObjectMapper per leggere una stringa creata da una risposta con json non valido - java, jackson, objectmapper

Utilizzando Jackon ObjectMapper per leggere una stringa creata da una risposta con json non valido - java, jackson, objectmapper

Problema durante l'utilizzo di Jackon ObjectMapper per leggere una stringa creata da una risposta JSON non valida

Ecco il frammento pertinente del codice:

Response response = request.get();
String responseAsString = response.readEntity(String.class);
ObjectMapper mapper = new ObjectMapper();
JsonNode responseNode = mapper.readTree(responseAsString);

Quando eseguo questo codice ottengo questa eccezione: com.fasterxml.jackson.core.JsonParseException: Unexpected character ("-" (code 45)): was expecting comma to separate OBJECT entries

Informazioni sul problema: Sto facendo una richiesta GET e sta rispondendo con successo. Quindi converto quella risposta in una stringa in modo da poterla modificare in un JsonNode ed estrarre le parti che desidero. Se stampo la rispostaAsString sembra così:

{
"account": 123456789,
"balance": 5602,
"dateTime": 2017-06-15T03:29:00,
"token": "H77ABC0PPIQ"
}

Credo che il problema sia dovuto al modo in cui si forma la risposta poiché non tutti i valori vengono inviati come stringhe. I loro tipi sono i seguenti:

account: long
balance: long
dateTime: DateTime
token: String

Non sono sicuro di come convertire la risposta in un oggetto Json in modo da poter ottenere singoli valori, ad esempio il numero di conto.

Qualsiasi consiglio è apprezzato. Grazie!

risposte:

1 per risposta № 1

Il problema è con JSON formattato male. Puoi usare strumenti come JSONlint per verificare JSON. Dovresti verificare in che modo viene eseguito il marshalling del payload della richiesta che stai ricevendo. Con un JSON appropriato nella richiesta, il tuo codice funzionerebbe perfettamente.

Come test rapido, userò ObjectMapper per serializzare, stampare, deserializzare e quindi navigare in un oggetto account.

Classe di dominio (sto usando Lombok per brevità)

@Data
@AllArgsConstructor
private class Account {
private Integer account;
private Integer balance;
private String dateTime;
private String token;

}

Test:

@Test
public void test() throws IOException {

ObjectMapper mapper = new ObjectMapper();
mapper.enable(SerializationFeature.INDENT_OUTPUT);
String responseAsString = mapper.writeValueAsString(new Account(123456789,5602,"2017-06-15T03:29:00","H77ABC0PPIQ"));
System.out.print(responseAsString);
JsonNode responseNode = mapper.readTree(responseAsString);

assertEquals("2017-06-15T03:29:00",responseNode.get("dateTime").textValue());
}

JSON generato serializzando l'oggetto account:

{
"account" : 123456789,
"balance" : 5602,
"dateTime" : "2017-06-15T03:29:00",
"token" : "H77ABC0PPIQ"
}