Как проверить пустую строку массива перед созданием объекта json в Java?

#java #gson #classcastexception

#java #gson #classcastexception

Вопрос:

Я получаю пустой массив в строке в качестве ответа от сервера и получаю ClassCastException при преобразовании его в JSONObject, потому что это пустой массив. Вот фрагмент кода.

 final String errorMessage = IOUtils.toString(errorStream); // response is "[]"
if (isJson(errorMessage)) {
  final JsonObject jsonResult = new Gson().fromJson(errorMessage, JsonObject.class);
        throw new IOException(jsonResult.get("error").toString());
} else {
    throw new IOException("Json response is"   errorMessage);
}
  

Вот метод isJson

 public static boolean isJson(String Json) {
        try {
            new JSONObject(Json);
        } catch (JSONException ex) {
            try {
                new JSONArray(Json);
            } catch (JSONException ex1) {
                return false;
            }
        }
        return true;
    }
  

должен ли я добавить проверку для сравнения «[]», например

 if(isJson(errorMessage) amp;amp; !errorMessage.equals("[]"))
  

или может быть любой другой лучший способ сделать это.

Пожалуйста, укажите.

Спасибо,

Комментарии:

1. Пустой массив json все равно должен быть массивом json… если вы получаете исключение, можете ли вы предоставить полный stacktracke?

2. Вы не должны приводить что-то, что может быть либо массивом, либо объектом к JsonObject . Вместо этого вы должны привести его к JsonElement .

3. Если у вас есть java POJO, соответствующий этому ответу, вы можете использовать com.fasterxml.jackson.databind. ObjectMapper для прямого сопоставления строки json с этим объектом. Я использую это каждый раз. Просто предложение из моего опыта. 🙂

4. Проверьте с помощью if(errorStream.length()==0){ // Выполняйте свою работу }else{ // Выполняйте свою работу}

Ответ №1:

Вы можете использовать метод из is* семейства:

 Gson gson = new GsonBuilder().create();

String[] jsons = {"[]", "[ ]", "[rn]", "{}", "{"error":"Internal error"}"};
for (String json : jsons) {
    JsonElement root = gson.fromJson(json, JsonElement.class);
    if (root.isJsonObject()) {
        JsonElement error = root.getAsJsonObject().get("error");
        System.out.println(error);
    }
}
  

С принтами:

 null
"Internal error"
  

Нет смысла проверять "[]" строку, потому что между скобками может быть много разных белых символов. JsonElement является корневым типом для всех JSON объектов и безопасен в использовании.

Ответ №2:

Попробуйте это

 if(!errorMessage[0]==null)
  

Если ваш массив пуст в позиции 0, возвращается значение null, или если вы указываете размер массива, когда объявляете, что это должно быть сделано:

  if(!errorMessage[0]=="")
  

Комментарии:

1. Пожалуйста, добавьте некоторые пояснения к вашему коду, чтобы другие могли извлечь из него уроки