Тестирование нулевых объектов JSON в Java / Android

Я получаю этот LogCat:

06-22 15:30:53.731: E/AndroidRuntime(2389): java.lang.NumberFormatException: Invalid float: "null"
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.StringToReal.invalidReal(StringToReal.java:63)
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.StringToReal.parseFloat(StringToReal.java:310)
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.Float.parseFloat(Float.java:300)
06-22 15:30:53.731: E/AndroidRuntime(2389):     at java.lang.Float.valueOf(Float.java:337)

вот код:

try
{
    jObject = new JSONObject(result);
    starAvg = jObject.getString("AverageRating"); 
}
ratingsBar = (RatingBar) findViewById(R.id.theRatingBar);
ratingsBar.setRating(Float.valueOf(starAvg));

вот:

в PHP я усредняю общие числа в столбце таблицы MySQL. Когда есть какие-либо строки, он отправит назад среднее значение данных в нем и он кодирует его, и Java берет его как объект JSON. Но иногда бывают случаи, когда таблица может иметь 0 строк, поэтому я получаю этот объект JSON:

 {"AverageRating":null}

мое приложение затем падает и LogCat is как видно выше.

The String похоже, не волнует, если он поднимает нулевой объект JSON, но приложение падает, когда я делаю Float.valueOf(theString).

еще одна заметка, я попытался проверить этот способ:

if String is Null, Float = 0 
if String is not null, Float.valueOF(String)

но он никогда не читает строку как null. Это на самом деле не null в этом случае?

4 ответов


использовать следующий метод JsonObject чтобы проверить, является ли значение против любого ключа null

public boolean isNull(java.lang.String key)

этот метод используется для проверки Null против любого ключа или если для ключа нет значения.

использовать ниже фрагмент

if (jsonObject.isNull("AverageRating")) {
    Toast.makeText(this, "Cannot Convert!!", Toast.LENGTH_LONG).show();
    //float set to 0
} else {
    Float.valueOf(jsonObject.getString("AverageRating"));
}

String str = jObject.getString("AverageRating");
float number = 0.f;
try
{
    number = Float.parseFloat(str);
}
catch (NumberFormatException e)
{
    number = 0;
}

parseFloat() выдаст исключение, если оно получит null.


проверьте значение null перед разбором значения,

String s = jObject.getString("AverageRating");
if (s != null) {
  double rating = Double.parseDouble(s);
  // whatever
}

это, как говорится, если значение AverageRating действительно число, тогда сущность, которая генерирует JSON, не должна добавлять его в JSON как строку. если для поля нет значения, поле должно отсутствовать. если для поля есть значение, оно должно быть числом.

если бы это было правдой, вы могли бы справиться с этим так,

if (jObject.has("AverageRating")) {
  double rating = jObject.getDouble("AverageRating");
  // whatever
}

другие сообщения предложили просто поймать NumberFormatException. это правильно только в том случае, если вы ожидаете иметь допустимое значение double в поле все время и считаете его исключительным в противном случае. если вы знаете / ожидаете, что поле будет несколько раз отсутствовать, это не квалифицируется как исключительное условие.


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

это, как говорится проверить значение null, как ключ, как значение в формате JSON.