2013-10-03 14 views
33

L'oggetto JSON sto ricevendo simile a questa:Come verificare se l'oggetto JSON è vuoto in Java

[{"foo1":"bar1", "foo2":"bar2", "problemkey": "problemvalue"}] 

Quello che sto cercando di verificare è l'esistenza di problemvalue. Se problemvalue restituisce un oggetto JSON, sono felice. In caso contrario, restituirà come {}. Come posso testare questa condizione? Ho provato diverse cose inutilmente.

Questo è quello che ho provato finora:

//  if (obj.get("dps") == null) { //didn't work 
//  if (obj.get("dps").equals("{}")) { //didn't work 
if (obj.isNull("dps")) { //didn't work 
    System.out.println("No dps key"); 
} 

mi aspettavo una di queste linee per la stampa "Nessuna chiave dps" perché {"dps":{}}, ma per qualsiasi motivo, non lo è. Sto usando org.json. Il file jar è org.json-20120521.jar.

+0

perché non basta 'System.err.println (obj.get (" dps "))'? – djechlin

+0

@djechlin, grazie per il suggerimento. Restituisce "{}", ma per qualche ragione, non colpisce la mia seconda istruzione if sopra. = (Non include spazi aggiuntivi b/ci usato questa linea per assicurarsi che System.out.println ("questo è ciò che dps è:" + obj.get ("dps") + "zzz"); – Classified

+1

Il Il metodo 'equals()' probabilmente non funziona perché quando si stampa l'oggetto nella console, Java sta chiamando 'toString()' sull'oggetto per generare il valore '" {} "'. Ma quando si ' richiamando '.equals (" {} ")', stai confrontando alcuni 'Object' che probabilmente non sono' String', a 'String'. Come soluzione, potresti fare:' obj.get ("dps ") .toString(). equals (" {} ")', ma nel migliore dei casi è una soluzione hacker. –

risposta

86
obj.length() == 0 

è quello che vorrei fare.

+1

Viene contrassegnato automaticamente come di bassa qualità perché è troppo corto.Ti dispiacerebbe espanderlo aggiungendo del testo per spiegare come risolve il problema? – gung

+1

@gung che farebbe solo questa risposta * peggio *. c'è un motivo per cui * flag * di bassa qualità non cancellano automaticamente le risposte. – djechlin

+0

@gung La risposta accettata è altrettanto breve. È diretto come questo risolve il problema. –

2

Prova:

if (record.has("problemkey") && !record.isNull("problemkey")) { 
    // Do something with object. 
} 
+0

thx per il suggerimento. quando ho provato il tuo codice, pensa che {} non sia nullo e stampa il mio messaggio, che non è quello che voglio. non so perché pensa che {} non sia nullo – Classified

-1

Prova /*string with {}*/ string.trim().equalsIgnoreCase("{}")), forse c'è qualche spazi aggiuntivi o qualcosa

+0

thx per il suggerimento. Ho controllato e non ci sono spazi extra. = ( – Classified

6

Una notazione JSON {} rappresenta un oggetto vuoto, il che significa un oggetto senza membri. Questo non è lo stesso di null. Né è una stringa, come si sta tentando di confrontarla con la stringa "{}". Non so quale libreria JSON stai usando, ma cerco di guardare per il metodo di qualcosa di simile:

isEmptyObject() 
+3

thx per il tuo suggerimento sto usando org.json (file jar org.json-20120521.jar). Non sembra che ci sia un metodo chiamato isEmptyObject. = ( – Classified

+0

@Classified Non ho familiarità con org .json quindi questo potrebbe non essere il modo ottimale.Un oggetto vuoto non ha un membro quindi quindi le chiavi di metodo() dovrebbero restituire iteratore con lunghezza zero getJSONObject ("problemkey"). keys() - controlla la lunghezza di quello – Anderson

+0

quale libreria utilizzo? Ho trovato org.json tramite una ricerca su google, quindi non so quanto sia buono/cattivo ma sembra piuttosto popolare. http://www.json.org/javadoc/org/json/JSONObject.html .thx di nuovo per le tue risposte e aiuto – Classified

0
Object getResult = obj.get("dps"); 
if (getResult != null && getResult instanceof java.util.Map && (java.util.Map)getResult.isEmpty()) { 
    handleEmptyDps(); 
} 
else { 
    handleResult(getResult); 
} 
25

Se stai bene con un hack -

obj.toString().equals("{}"); 
+22

O meglio 'jsonObject.length() == 0' – hgoebl

+8

' jsonObject.length() 'è il metodo corretto. Se si dispone di un oggetto potenzialmente grande, obj.toString() serializza l'intero oggetto prima di eseguire il confronto, che è potenzialmente costoso. –

-1

utilizzare il seguente codice:

if(json.isNull()!= null){ //returns true only if json is not null 

} 
+0

Come va il cast? –

0

ho aggiunto isEmpty() metodi su JSONObject e JSONArray()

//on JSONObject 
public Boolean isEmpty(){   
    return !this.keys().hasNext(); 
} 

...

//on JSONArray 
public Boolean isEmpty(){ 
    return this.length()==0;   
} 

si può ottenere qui https://github.com/kommradHomer/JSON-java

2

vorrei fare le seguenti operazioni per verificare la presenza di un oggetto vuoto

obj.similar(new JSONObject()) 
+0

Questo è in realtà abbastanza intelligente. Non lo userei su qualcosa di così piccolo come questo, ma sicuramente non è un controllo a vuoto a cui avevo pensato prima. – Csteele5

0

Se JSON restituito con struttura seguente quando i record è un ArrayNode:

{}client 
    records[] 

e si desidera controllare se il nodo record ha qualcosa in esso quindi puoi farlo usando un metodo size();

if (recordNodes.get(i).size() != 0) {} 
0
if (jsonObj != null && jsonObj.length > 0) 

Per verificare se un oggetto JSON nidificato è vuota all'interno di un JSONObject:

if (!jsonObject.isNull("key") && jsonObject.getJsonObject("key").length > 0) 
+1

Per favore guarda [Come modifico i miei blocchi di codice?] (Https://meta.stackoverflow.com/questions/251361/how-do-i-format-my-code-blocks) e poi aggiungi qualche spiegazione al tuo risposta. – Clijsters

0
@Test 
public void emptyJsonParseTest() { 
    JsonNode emptyJsonNode = new ObjectMapper().createObjectNode(); 
    Assert.assertTrue(emptyJsonNode.asText().isEmpty()); 
} 
Problemi correlati