#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. Пожалуйста, добавьте некоторые пояснения к вашему коду, чтобы другие могли извлечь из него уроки