简体   繁体   中英

JSON.getString doesn't return null

I have a response coming back from a server and I am expecting a String value, so I wrote this for parsing it

public String getMessageFromServer(JSONObject response) {
    String msg = response.getString("message");
    return msg;
}

then, when I use this in my code and get a null value from the server, the function doesn't return null , it returns "null" instead.

I have seen this bug report , but I don't see a solution.

EDIT:

I have a small hack to solve this but it's ugly and I'm looking for a better solution:

public String getMessageFromServer(JSONObject response) {
    Object msg = response.get("message");
    if(msg == null) {
         return null;
    }
    return (String) msg;
}    

EDIT #2:

after years, going back to this question, I see that I was not entirely wrong here and that JSONObject has a built in method for this.

The way to get an optional value from a JSONObject is with using this method JSONObject.optString("message", DEF_VALUE);

The hack looks okay for your situation.

The other option would be to use the method boolean isNull(String key) and then based on the returned boolean value proceed with your option. Something like:

public String getMessageFromServer(JSONObject response) {
    return ((response.has("message") && !response.isNull("message"))) ? response.getString("message") : null;
} 

But then, I don't think there's much of a difference between the your current implementation and this.

This is easy to solve when using Kotlin class extensions:

fun JSONObject.optNullableString(name: String, fallback: String? = null) : String? {
    return if (this.has(name) && !this.isNull(name)) {
        this.getString(name)
    } else {
        fallback
    }
}

Then eg name will be null in:

val name : String? = JSONObject("""{"id": "foo", "name":null}""").optNullableString("name")

More simple way in Kotlin

fun JSONObject.getNullableString(name: String) : String? {
    if (has(name) && !isNull(name)) {
        return getString(name)
    }
    return null
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM