2013-04-10 14 views
34

Ich versuche, den Typ des Werts in einem JSONObject gespeichert zu bekommen.Wie überprüft man den Typ eines Wertes von einem JSONObject?

String jString = {"a": 1, "b": "str"}; 
JSONObject jObj = new JSONObject(jString); 

Ist es möglich, den Typ des Wertes bei Schlüssel "a" gespeichert zu bekommen; etwas wie jObj.typeOf("a") = java.lang.Integer?

+1

Wenn Sie mehr Kontrolle über JSON Parsen möchten, verwenden Sie einen anderen Parser als 'org.json', wie Jackson. – laalto

Antwort

57

Sie können das Objekt mit der Methode get() aus dem JSON abrufen und dann den Operator instanceof verwenden, um nach dem Objekttyp zu suchen. Etwas wie folgt aus: -

String jString = "{\"a\": 1, \"b\": \"str\"}"; 
JSONObject jObj = new JSONObject(jString); 
Object aObj = jObj.get("a"); 
if(aObj instanceof Integer){ 
    System.out.println(aObj); 
} 
+0

Beachten Sie, dass es "Integer" oder "Long" sein kann; 'Float' oder' Double'. – 18446744073709551615

+0

hehe, ich habe ein mythisches Beispiel für diesen Fall: Ich habe zwei gleiche JSONObject {"Besuche": 4880502, ...}, aber wenn ich dieses Feld von object.get ("Besuche") bekomme, habe ich: Objekt1 Wert: 4880502.0 | Klasse java.lang.Double object2 val: 4880502 | Klasse java.lang.Integer –

+0

Hat gson eine ähnliche Funktionalität? Ihre Dokumentation scheint nichts über den Typ eines bestimmten Feldes zu sagen. –

9

Die beste Lösung ist die Verwendung JSONObject.get() und überprüfen Sie den Typ mit instanceof Operator.

+0

Sie können diese Art von Ansatz für jeden Typ verwenden, die Sie benötigen, die entsprechenden Ausnahmen zu fangen –

+0

1. Ansatz, Ausnahme zu werfen, ist in Bezug auf Ressource Bit teuer, und sollte vermieden werden, vor allem bei ressourcenkritischen Geräten verwendet. (Handy/Tabs) – Ankit

+0

@ ay89 danke! behoben. – BobTheBuilder

0

Sie können alle Daten als String analysieren und dann versuchen, es auf die gewünschte Art zu konvertieren. An diesem Punkt können Sie die Ausnahme abfangen und feststellen, welcher Typ die analysierten Daten sind.

2

Bitte beachten Sie, dass JSONObject.get() entweder als java.lang.Integer oder java.lang.Long, zum Beispiel eine ganze Zahl zurückgeben kann, für {a:3,b:100300000000} wir

D/+++  (5526): +++a=>class java.lang.Integer:3 
D/+++  (5526): +++b=>class java.lang.Long:100300000000 

sehen verwende ich den Code wie (beachten Sie, dass wir Typen verwenden long und double statt int und float, und dass es in meiner Aufgabe sein kann keine verschachtelten JSONObject oder JSONArray so werden sie nicht unterstützt):

for (String k : new AsIterable<String>(json.keys())) { 
      try { 
        Object v = json.get(k); 
     //Log.d("+++","+++"+k+"=>"+v.getClass()+":"+v); 
        if (v instanceof Integer || v instanceof Long) { 
          long intToUse = ((Number)v).longValue(); 
          ... 
        } else if (v instanceof Boolean) { 
          boolean boolToUse = (Boolean)v).booleanValue(); 
          ... 
        } else if (v instanceof Float || v instanceof Double) { 
          double floatToUse = ((Number)v).doubleValue(); 
          ... 
        } else if (JSONObject.NULL.equals(v)) { 
          Object nullToUse = null; 
          ... 
        } else { 
          String stringToUse = json.getString(k); 
          ... 
        } 
      } catch (JSONException e2) { 
        // TODO Auto-generated catch block 
        Log.d("exc: "+e2); 
        e2.printStackTrace(); 
      } 
    } 

wo AsIterable uns die for(:) Schleife mit einem Iterator verwenden können und ist definiert als:

public class AsIterable<T> implements Iterable<T> { 
    private Iterator<T> iterator; 
    public AsIterable(Iterator<T> iterator) { 
     this.iterator = iterator; 
    } 
    public Iterator<T> iterator() { 
     return iterator; 
    } 
} 
+0

Warum wird String nicht in String umgewandelt und Sie verwenden die getString-Methode erneut? – htafoya

Verwandte Themen