Android Jsonとnull値


94

json値がnullであることをどのように検出できますか?例:[{"username":null}、{"username": "null"}]

最初のケースは存在しないユーザー名を表し、2番目のケースは「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=

回答:


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)への呼び出しを置き換えます。
スカイケルシー

@SkyKelsey:なぜあなたはそれを言うでしょうか?これらは、異なるセマンティクスを持つ異なるものです...
K-ballo '15

あなたが正しい。つまり、ほとんどの場合、has()を使用しますが、実際には!isNull()を使用します。ほとんどの場合、指定されたキーに値が存在するかどうかを確認します。これは、!isNull()を使用する方が適切です。
スカイケルシー

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
回答ありがとうございます。ただし、キーが存在しない場合はJSONExceptionがスローされるため、アイテムがnullの場合はnullを返すほうが論理的です
Addev

ライブラリ自体の開発者とスタイルの設定を行う必要があります:p
FThompson

1
"null"!= null。問題は、isNullには9以上のAPIが必要であり、場合によっては下位のAPIを機能させたいということです。この答えはよく、jsonObject.getString!= "null"を使用できます。
sagits 2014

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

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

以下は、1行のコードだけで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.