Soru JSONObject öğesinden bir değerin nasıl kontrol edilir?


Depolanan değerin türünü almaya çalışıyorum JSONObject.

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

Anahtarda depolanan değerin türünü almak mümkün mü "a";  gibi bir şey jObj.typeOf("a") = java.lang.Integer?


37
2018-04-10 08:02


Menşei


JSON ayrıştırma üzerinde daha fazla kontrol istiyorsanız, diğer bazı ayrıştırıcıları kullanın. org.jsonJackson gibi. - laalto


Cevaplar:


Nesneyi kullanarak JSON'dan alabilirsiniz. get() yöntemini kullanın ve sonra instanceof Nesne türünü kontrol etmek için operatör. Böyle bir şey: -

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

61
2018-04-10 08:06



Olabileceğini unutmayın Integer veya Long; Float veya Double. - 18446744073709551615
hehe, bu dava için bazı efsanevi örneklerim var: İki aynı JSONObject {"ziyareti" var: 4880502, ...}, ama bu alanı object.get ("ziyaret") ile aldığımda: object1 val: 4880502.0 | sınıf java.lang.Double object2 val: 4880502 | sınıf java.lang.Integer - Ivan Trechyokas
Gson'un benzer bir işlevi var mı? Belgeleri belirli bir alanın türüne ilişkin bir şey belirtmemektedir. - Ravi Naik


En iyi çözüm kullanmaktır JSONObject.get() ve kullanarak türü kontrol edin instanceof Şebeke.


9
2018-04-10 08:03



İhtiyacınız olan her tür için uygun istisnaları yakalamak için bu tür bir yaklaşımı kullanabilirsiniz. - Vito Gentile
1. yaklaşım, istisna atma, kaynak açısından biraz maliyetlidir ve özellikle kaynak kritik cihazlarda kullanılıyorsa kaçınılmalıdır. (Mobil / tablet) - Ankit
@ ay89 thanx! onu düzeltti. - BobTheBuilder
Baraky Cevabınız için teşekkür ederim ama ek kütüphanelerden kaçınmaya çalışıyorum. - Ungureanu Liviu
@Ungureanu Liviu bu sadece bir yazım hatası oldu :) - BobTheBuilder


Lütfen bunu not al JSONObject.get() bir tam sayıyı ya java.lang.Integer veya java.lang.Longörneğin, {a:3,b:100300000000} görürüz

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

Kodu kullanıyorum (tür kullandığımızı unutmayın long ve double yerine int ve floatve bu benim görevimde olabilir yuvalanmış JSONObject veya JSONArray bu yüzden desteklenmezler):

    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();
            }
    }

nerede AsIterable kullanmamıza izin ver for(:) Bir yineleyici ile döngü ve şöyle tanımlanır:

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;
    }
}

2
2018-03-19 11:06



String string'e neden dökülmez ve getString yöntemini tekrar kullanırsınız? - htafoya


Tüm verileri şu şekilde ayrıştırabilirsiniz: String ve sonra istediğiniz türe dönüştürmeyi deneyin. Bu noktada, istisnayı yakalayabilir ve ayrıştırılan verilerin hangi tür olduğunu belirleyebilirsiniz.


0
2018-04-10 08:07