Android Json 및 null 값


94

json 값이 null 인 경우 어떻게 감지 할 수 있습니까? 예 : [{ "username": null}, { "username": "null"}]

첫 번째 경우는 존재하지 않는 사용자 이름을 나타내고 두 번째 경우는 "null"이라는 사용자를 나타냅니다. 그러나 두 값을 모두 검색하려고하면 "null"문자열이됩니다.

JSONObject json = new JSONObject("{\"hello\":null}");
json.put("bye", JSONObject.NULL);
Log.e("LOG", json.toString());
Log.e("LOG", "hello="+json.getString("hello") + " is null? "
                + (json.getString("hello") == null));
Log.e("LOG", "bye="+json.getString("bye") + " is null? "
                + (json.getString("bye") == null));

로그 출력은 다음과 같습니다.

{"hello":"null","bye":null}
hello=null is null? false
bye=null is null? false

1
JSON을 제어합니까? 그런 다음 사용자 이름 필드를 전송하고 사용하지 않는 has(java.lang.String);방법
Blundell은

2
이것은 알려진 의도적 인 버그입니다. code.google.com/p/android/issues/detail?id=13830
Heinzi

답변:


220

을 사용해보십시오 json.isNull( "field-name" ).

참조 : http://developer.android.com/reference/org/json/JSONObject.html#isNull%28java.lang.String%29


4
나는 더 나아가서 has (KEY_NAME)을 절대 사용하지 말라고 말하고! isNull (KEY_NAME)에 대한 호출을 대체합니다.
Sky Kelsey 2013

@SkyKelsey : 왜 그렇게 말하겠습니까? 그것들은 다른 의미를 가진 다른 것들입니다 ...
K-ballo

네가 옳아. 내가 의미하는 바는 당신이 has ()를 사용하는 대부분의 경우, 당신은 정말로 우리를 선호한다는 것입니다! isNull (). 대부분의 경우 지정된 키에 값이 있는지 확인하고 있으며! isNull ()을 사용하면 더 잘 수행됩니다.
Sky Kelsey 2013

17

JSONObject # getString은 주어진 키가있는 경우 값을 반환하므로 정의상 null이 아닙니다. 이것이 JSONObject.NULL이 존재하는 이유입니다. null JSON 값을 나타내는 것입니다.

json.getString("hello").equals(JSONObject.NULL); // should be false
json.getString("bye").equals(JSONObject.NULL); // should be true

1
귀하의 답변에 감사하지만 imho 및 키가 존재하지 않으면 JSONException이 throw되기 때문에 항목이 null
Addev

당신은 라이브러리 자체의 개발자들과 함께 스타일 선호를 받아 들여야 할 것입니다. : p
FThompson

1
"null"! = null. 문제는 isNull에 api 9+가 필요하고 때로는 더 낮은 API가 작동하기를 원한다는 것입니다. 이 대답은 jsonObject.getString! = "null"을 사용할 수 있습니다.
sagits jul.

14

Android의 경우 이러한 매핑이 존재하지 않으면 JSONException이 발생합니다. 따라서이 메서드를 직접 호출 할 수 없습니다.

json.getString("bye")

데이터가 비어있을 수있는 경우 (키가 없을 수 있음)

json.optString("bye","callback string");

또는

json.optString("bye");

대신.

데모 코드에서

JSONObject json = new JSONObject("{\"hello\":null}");
json.getString("hello");

이것은 null이 아닌 String "null"입니다.

너의 소리 사용

if(json.isNull("hello")) {
    helloStr = null;
} else {
    helloStr = json.getString("hello");
}

4

먼저 isNull().... 작동하지 않으면 아래를 시도하십시오.

또한 JSONObject.NULLnull 값을 확인 해야 합니다 ...

 if ((resultObject.has("username")
    && null != resultObject.getString("username")
    && resultObject.getString("username").trim().length() != 0)
      {
               //not null
        }

그리고 귀하의 경우에는 resultObject.getString("username").trim().eqauls("null")


"if (! resultObject.isNull ("username ") && resultObject.getString ("username "). trim (). length ()! = 0)"로 단순화
Sky Kelsey 2013

3

먼저 json을 파싱하고 나중에 객체를 처리해야한다면 이것을 시도해보십시오.

파서

Object data = json.get("username");

매니저

if (data instanceof Integer || data instanceof Double || data instanceof Long) {
     // handle number ;
} else if (data instanceof String) {
     // hanle string;               
} else if (data == JSONObject.NULL) {
     // hanle null;                 
}

2

다음은 한 줄의 코드로 JSON 문자열을 얻을 수 있도록 사용하는 도우미 메서드입니다.

public String getJsonString(JSONObject jso, String field) {
    if(jso.isNull(field))
        return null;
    else
        try {
            return jso.getString(field);
        }
        catch(Exception ex) {
            LogHelper.e("model", "Error parsing value");
            return null;
        }
}

그리고 다음과 같이 :

String mFirstName = getJsonString(jsonObject, "first_name");

문자열 값을 제공하거나 문자열 변수를 null로 안전하게 설정합니다. 나는 이런 함정을 피하기 위해 할 수있을 때마다 Gson을 사용합니다. 제 생각에는 null 값을 훨씬 더 잘 처리합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.