Sto sviluppando un servizio web REST usando PlayFramework 2.5 (Java) e associazione dei dati del modulo (da Spring Framework). Ho una certa esperienza con questa API e mi piace il modo in cui formalizza i vincoli di convalida (ad esempio Richiesto), quindi vorrei evitare di utilizzare l'API BodyParser.
Devo analizzare una richiesta JSON come questa:
{
"elements": [
{
"val": "1"
},
{
"val": ["1","2","3"]
}
]
}
Il problema è che "val" accetta due diversi tipi: una stringa (java.lang.String in Java) e una matrice di stringhe (java.util.List nel mio codice).
Come ho potuto "tipicamente" modellare un tale modulo JSONnel mio codice Java? Ho già provato a utilizzare una classe astratta (e generica) implementata da due diverse sottoclassi con tipi diversi per l'attributo "val", ma Spring non riesce a creare un'istanza dell'oggetto (BeanInstantiationException).
Ecco l'attuale modello di dati:
public class Foo {
@Constraints.Required
public List<Fii> elements;
}
public class Fii {
@Constraints.Required
// Which type ? Object ?
public ? val;
}
risposte:
3 per risposta № 1public class Response
{
List<ResponseEntry> response;
/*getters + setters */
public static class ResponseEntry
{
private List<Value> elements;
/*setters + getters*/
public static class Value
{
private List<Object> val;
}
}
}
Sfortunatamente, con la struttura del JSON tustanno gestendo, l'unico modo per deserializzarlo è avere l'attributo value come type Object. Tuttavia, una volta deserializzato JSON, è possibile capire facilmente se il valore è un oggetto o un singolo valore.
Si noti che JSON supporta solo cinque tipi di dati: oggetti (Mappa in Java), matrici, stringhe, numerici e booleani. Sembra che nel tuo caso, il valore sarebbe molto probabilmente un numero o una mappa di numeri; allora hai due possibilità per verificare. Utilizzando una rapida istanza di confronto, dovresti essere in grado di capire che tipo di valore è.
ObjectMapper mapper = new ObjectMapper();
Response r = mapper.readValues(json, Response.class);
Value val = r.response.get(0).values.get(0);
if (val.value instanceof Map)
; // multiple
else
; // single