JSON jsonObject.optString () возвращает строку "null"

Я разрабатываю приложение для Android, которое использует JSON для связи с сервером, и у меня есть странная проблема, когда я пытаюсь разобрать мой json-файл.

Это мой json с сервера

{ "street2": null, "province": null, "street1": null, "postalCode": null, "country": null, "city": null } 

Я получаю значение для Города, вызывая String city = address.optString("city", "") на моем адресе Json-object. Для этой ситуации я ожидаю, что city будет пустым (вот что такое optString здесь, не так ли?), Но на самом деле он содержит строку «null». Таким образом, дополнительные null- или isEmpty-checks вернут false, поскольку строка содержит текст. Если я вызываю address.isNull("city") он возвращает true, что является правильным. optString только optString .

Я не мог найти что-либо в Google или Stackoverflow для этой проблемы. Я действительно не понимаю, как это может произойти, поскольку я думал, что optString будет делать именно то, что я ожидал. Кто-нибудь знает, что здесь происходит не так?

Solutions Collecting From Web of "JSON jsonObject.optString () возвращает строку "null""

Вы не одиноки в том, чтобы справляться с этой проблемой и почесывать голову, думая: «Неужели они действительно имели в виду это?» Согласно проблеме AOSP, инженеры Google действительно считают эту ошибку , но они должны быть совместимы с реализацией org.json, даже с ошибкой.

Если вы думаете об этом, это имеет смысл, потому что если тот же код, который использует те же библиотеки, что и на других средах Java, ведет себя по-другому в Android, будут проблемы с совместимостью при использовании сторонних библиотек. Даже если намерения были хорошими, и это действительно исправляло ошибки, это открыло бы совершенно новую банку червей.

В соответствии с вопросом AOSP :

Поведение преднамеренное; Мы вышли из нашего пути, чтобы быть совместимым с ошибкой с org.json. Теперь, когда это исправлено, неясно, следует ли исправить наш код. Приложения, возможно, полагаются на это ошибочное поведение.

Если это вызывает у вас горе, я рекомендую вам обходным путем, используя другой механизм для проверки нулевого значения, например json.isNull ().

Вот простой способ помочь вам:

 /** 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); } 

У вас в основном есть 2 варианта:

1) Отправьте полезную нагрузку JSON с нулевыми значениями

 { "street2": "s2", "province": "p1", "street1": null, "postalCode": null, "country": null, "city": null } 

Вам нужно будет проверить нулевые значения и проанализировать их соответственно:

 private String optString_1(final JSONObject json, final String key) { return json.isNull(key) ? null : json.optString(key); } 

2) Не отправляйте ключи с нулевыми значениями и напрямую используйте optString (ключ, null) (чтобы сохранить полосу пропускания).

 { "street2": "s2", "province": "p1" } 
 if (json != null && json.getString(KEY_SUCCESS) != null){ // PARSE RESULT }else{ // SHOW NOTIFICIATION: URL/SERVER NOT REACHABLE 

}

То есть для проверки json null с ключевым словом.

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

Это вы получаете: String «null» не равно null.

Ваше использование shoud

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

Сначала проверьте с isNull () …. если не работает, тогда попробуйте belows

А также у вас есть JSONObject.NULL, чтобы проверить значение null …

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

И в вашем случае также проверьте

 resultObject.getString("username").trim().eqauls("null") 

Если вы должны сначала проанализировать 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; } 

Если значения для ключа равны нулю, как показано ниже

{

«Статус»: 200,

«Сообщение»: «»,

"данные": {

 "totalFare": null, 

},

}

Проверьте с помощью «isNull», например:

String strTotalFare;

If (objResponse.isNull ("totalFare"))

{

StrTotalFare = "0";

} Else {

StrTotalFare = objResponse.getString ("totalFare");

}

Если значение «null» для ключевого «totalFare», функция выше будет вводить значение if и присваивать значение нулю, иначе он получит фактическое значение из ключа.

Используя ответ Мэтта Квигли в качестве основы, вот код, если вы хотите подражать полной функциональности optString, включая резервную часть, написанную в Kotlin и Java.

Котлин:

 fun optString(json: JSONObject, key: String, fallback: String?): String? { var stringToReturn = fallback if (!json.isNull(key)) { stringToReturn = json.optString(key, null) } return stringToReturn } 

Ява:

 public static String optString(JSONObject json, String key, String fallback) { String stringToReturn = fallback; if (!json.isNull(key)) { stringToReturn = json.optString(key, null); } return stringToReturn; } 

Просто передайте значение null для параметра fallback, если вам не нужен резерв.