Qual è il modo meno peggio di conoscere il tipo di una chiave dal file Json

2

nella nostra app abbiamo un file Json che contiene diverse proprietà usate per la configurazione del menu. Una delle chiavi dovrebbe dirci se una voce di menu dovrebbe essere visualizzata. Il fatto è che il valore per questa chiave, può essere un int ma scritto come String "0" o "1", un booleano scritto come String "true", "false" o un URL. Quindi, a seconda dell'elemento, uno di questi 3 valori "magici" ci dice se un oggetto specifico dovrebbe essere visualizzato o meno.

La mia domanda è: qual è il modo migliore o il modo elegante per conoscere il tipo di questo valore? Dobbiamo conoscere il tipo per una gestione diversa.

All'inizio ho creato un metodo per verificare se il valore è di tipo booleano.

return value.equals(true.toString()) || value.equals(false. toString()));

Lo stesso, dovrei creare un metodo se è int, ma per verificare se si tratta di un URL è un po 'complicato.

Quindi, poiché non ho trovato questo approccio molto elegante e leggibile, ho deciso di aggiungere il tipo di questa chiave "magica" nel file Json: Per il tipo booleano ho aggiunto:

"myKeyType": "boolean"

E così via per gli altri 2. Quindi mi piacerebbe sapere se aggiungere una proprietà type al file Json è una buona idea, se è responsabilità di Json dirci il tipo, o c'è un modo migliore per farlo?

EDIT: non riesco a cambiare il tipo di dati che ricevo, quindi devo fare i conti con lo scenario che ho descritto. In questo caso, quale delle due soluzioni che ho provato è più elegante? Il primo o il secondo con il tasto extra?

Grazie

    
posta Laura 02.04.2016 - 04:58
fonte

3 risposte

1

Mi dispiace dire che non esiste un modo elegante per questo design disordinato.

Se avessi qualche controllo sarebbe meglio dividere questi valori magici in un semplice array dove ogni proprietà è di un tipo.

riguardo al tuo suggerimento su "mykeytype": "booleano" alcune librerie json supportano questo fuori dalla scatola. Esempio json.net puoi impostare typenamehandling = auto e aggiungerà un campo aggiuntivo con informazioni di tipo quando mai il tipo di runtime non corrisponde al tipo statico.

Non sono disponibile alcuna libreria per il polimorfismo del supporto Android, ma questa domanda potrebbe essere un luogo per inizio:

    
risposta data 02.04.2016 - 08:14
fonte
1

Puoi davvero avere tutto ciò che vuoi nella risposta JSON finché lo definisci come standard e aderisci ad esso. Naturalmente, è necessario analizzare la risposta JSON standardizzata nel codice in base alle regole presentate.

Tuttavia, non mi piace il design attuale e avrei ridisegnato la risposta JSON (dal tuo recente commento sembra che tu abbia il controllo sulla struttura).

Il formato potrebbe essere

{
    "shouldBeDisplayed": true,
    "url": "http://myurl.com"
}

per un caso di verità e uno dei seguenti formati quando non dovrebbe essere visualizzato:

{
    "shouldBeDisplayed": false,
    "url": null
}

{
    "shouldBeDisplayed": false
}

Per una variabile booleana, sarebbe bello se restituissi solo true e false , anche se alcuni valori potrebbero essere considerati veri e falsi.

    
risposta data 02.04.2016 - 10:17
fonte
0

Dato che dici di avere il controllo su JSON con Java (in altre parole sul back-end). Sono sempre favorevole a proteggere un front-end di questo tipo di preoccupazioni proprietarie. Lascia che Java crei un file json che si adatta come un guanto, normalizza i dati prima di inviarli attraverso il filo.

    
risposta data 03.04.2016 - 16:12
fonte

Leggi altre domande sui tag