接口联调时拿到一段返回,是标准的 JSON 数组,同事说把这段转成 list 对象再遍历。听上去一句话的事,真写起来要区分语言、区分泛型,还得处理嵌套。

先分清两种 JSON

一种是数组,以方括号开头,天然对应 List;另一种是对象,以花括号开头,只能对应 Map 或者实体类。转换的第一步永远是先看最外层括号,不少解析失败都是把对象硬当数组解,抛出的异常却是数组越界,容易看偏。

Java 里最常见的一条路

List<User> list = JSON.parseArray(jsonStr, User.class);

fastjson 的 parseArray 直接按指定类型转,从 Postman 复制来的字符串要先去掉转义。用 Jackson 则是 objectMapper.readValue(json, new TypeReference<List<User>>(){}),泛型擦除要靠匿名子类兜住,写成 List.class 只会得到 List<LinkedHashMap>,一取值就抛类型转换异常。

Gson 和 Python 的写法

Gson 用 TypeToken 拿真实类型,new Gson().fromJson(json, new TypeToken<List<User>>(){}.getType())。Python 更省事,import json 后 json.loads(s) 直接得到 list 里装 dict,再映射成对象:list(map(lambda d: User(**d), data))。PHP 用 json_decode 时第二个参数要给 true 才返回数组,不给就是 stdClass 对象。

容易踩的四个坑

  • 字段名对不上:JSON 写 user_name,实体是 userName,加注解或开启下划线转驼峰。
  • 类型不匹配:字符串 12 转 int 会抛异常,先定成 String 再转换。
  • null 数组:后端返回空值时别直接遍历,先判空。
  • 日期格式:2026-10-22 10:00:00 这种要指定 pattern,否则解析失败。