You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 20:55:29