/ / Tipo di scelta per Play Framework JSON Form - java, json, spring, playframework

Digitare la scelta per Play Framework JSON Form - java, json, spring, playframework

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 № 1
public 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