I'm developing an Android App which uses JSON for the server communication and I've got a weird problem when I'm trying to parse my json file.
This is my json from the server
{ "street2": null, "province": null, "street1": null, "postalCode": null, "country": null, "city": null }
I'm getting the value for City by calling String city = address.optString("city", "")
on my address Json-object. For this situation I'm expecting city
to be empty (that's what optString is here for isn't it?) but in fact it contains the String "null". So further null- or isEmpty-checks will return false as the String contains text. If I call address.isNull("city")
it returns true which is correct. Only optString
fails.
I couldn't find anything on Google or Stackoverflow for this problem. I don't really understand how it can happen as I thought optString
would do exactly what I expected. Anybody knows what's going wrong here?
optString(String name) Returns the value mapped by name if it exists, coercing it if necessary, or the empty string if no such mapping exists.
You're not alone in running into this problem and scratching your head, thinking "Could they really have meant this?" According to an AOSP issue, the Google engineers did consider this a bug, but they had to be compatible with the org.json implementation, even bug-compatible.
If you think about it, it makes sense, because if the same code which uses the same libraries run in other Java environments behaves differently in Android, there would be major compatibility problems when using 3rd party libraries. Even if the intentions were good and it truly fixed bugs, it would open up a whole new can of worms.
According to the AOSP issue:
The behavior is intentional; we went out of our way to be bug-compatible with org.json. Now that that's fixed, it's unclear whether we should fix our code as well. Applications may have come to rely on this buggy behavior.
If this is causing you grief, I recommend you workaround by using a different mechanism to test for null, such as json.isNull().
Here's a simple method to help you out:
/** Return the value mapped by the given key, or {@code null} if not present or null. */ public static String optString(JSONObject json, String key) { // http://code.google.com/p/android/issues/detail?id=13830 if (json.isNull(key)) return null; else return json.optString(key, null); }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With