Java字符串转JSON(JSONObject/JSONArray)如何适配监听器回调?
解决思路与代码实现
1. 调整监听器方法的参数类型
把OnDataLoaded的参数改成Object,因为JSONArray和JSONObject都是Object的子类,这样两种类型的JSON结果都能正常传递。
2. 解析字符串时区分两种JSON类型
有两种实用的处理方式:
方式一:通过捕获异常尝试解析
先尝试把字符串转成JSONArray,如果抛出异常,再尝试转成JSONObject:
Object jsonResult = null; String str; try { str = new String(response.data); // 优先尝试解析为JSON数组 jsonResult = new JSONArray(str); } catch (JSONException e) { try { // 数组解析失败,尝试解析为JSON对象 jsonResult = new JSONObject(str); } catch (JSONException ex) { ex.printStackTrace(); // 处理既不是数组也不是对象的非法JSON格式 return; } } if (listener != null) { listener.OnDataLoaded(jsonResult); }
方式二:用JSONTokener提前判断类型(更高效)
通过JSONTokener读取JSON的第一个字符,直接判断是数组([)还是对象({),避免捕获异常的开销:
Object jsonResult = null; String str = new String(response.data); JSONTokener tokener = new JSONTokener(str); char firstChar = tokener.nextClean(); tokener.back(); // 把读取的字符放回,保证后续解析完整 if (firstChar == '[') { jsonResult = new JSONArray(tokener); } else if (firstChar == '{') { jsonResult = new JSONObject(tokener); } else { // 处理非法JSON格式 return; } if (listener != null) { listener.OnDataLoaded(jsonResult); }
3. 在监听器回调中处理不同类型
调用方收到回调后,用instanceof判断类型再强转处理:
@Override public void OnDataLoaded(Object jsonObj) { if (jsonObj instanceof JSONArray) { JSONArray jsonArray = (JSONArray) jsonObj; // 编写JSON数组的处理逻辑 } else if (jsonObj instanceof JSONObject) { JSONObject jsonObject = (JSONObject) jsonObj; // 编写JSON对象的处理逻辑 } }
内容的提问来源于stack exchange,提问作者ro.me
相关产品推荐
相关产品推荐

