无论是 Web 端还是移动端开发,都会涉及到对 JSONArray 的解析,通常状况下前端会和后端会约定好返回的数据是一个 JSONArray 数组,当然前端也会按照 JSONObject.getJSONArray(String name) 的方式去解析数据。但现实中的情况是后端由于某些原因直接返回了 null(而非空数组 [ ]),这时候前端依然按照数组的形式去解析就会抛出如下异常:
1 | org.json.JSONException: Value null at users of type org.json.JSONObject$1 cannot be converted to JSONArray |
这个异常明确的告诉我们,当 JSONArray 为 null 的时候,这个对象的属性发生了变化,由 JSONArray 变成了 JSONObject,然而前端却依然认为这是个 JSONArray 对象并以 JSONArray 的形式去取值,结果就抛出了异常。
那么,应该如何避免这种异常的发生呢?异常发生的原因是:我们以固定的取值方式去获取类型不定的值。如果我们在取值之前知道当前值的类型,并以对应的方式去取值就可以避免这种异常了。下面以一个例子进行说明:
1 | { |
1 | { |
上面两组 Json 值分别为返回数组和 NULL 时的情况,常规取值方式如下:
1 | try { |
正如之前的分析可知,当 users 值为 NULL 时会抛出异常。容错取值方式如下:
1 | try { |
容错取值方式并没有直接去获取 JSONArray,而是先获取了一个 Object 对象(这个对象的类型既可能是 JSONArray 也可能是 JSONObject),然后通过类型判断,将其转换成对应的类型进行后续的操作。