Java 解析 JSON 获取指定字段
·
方式一:使用阿里的 Fastjson 解析(⭐⭐⭐⭐⭐ 推荐,最常用,最简单)
✅ 优点
- 语法极度简洁,一行代码获取指定字段,开发效率最高;
- API 通俗易懂,学习成本极低;
- 支持 单层 JSON、嵌套 JSON、数组 JSON 所有格式;
- 是国内 Java 开发的事实标准,90% 的项目都在用(阿里、京东、保险行业等);
- 完美适配你的场景:kafka 异步消费的 JSON 消息,用 Fastjson 解析字段最快。
✅ 步骤 1:引入依赖(Maven)
<!-- 阿里Fastjson核心依赖,只需这一个,版本建议1.2.83+(修复漏洞) -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
✅ 步骤 2:完整使用示例(全部场景,复制即用)
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
public class FastjsonTest {
public static void main(String[] args) {
// ============ 1. 解析【单层JSON】获取字段 ============
String simpleJson = "{\"name\":\"张三\",\"age\":28,\"gender\":\"男\",\"phone\":\"13800138000\",\"isVip\":true}";
// 把JSON字符串转为JSONObject对象
JSONObject simpleObj = JSON.parseObject(simpleJson);
// 获取指定字段:语法 -> 对象.getString("字段名") / getInteger / getBoolean
String name = simpleObj.getString("name"); // 字符串字段:张三
Integer age = simpleObj.getInteger("age"); // 数字字段:28
Boolean isVip = simpleObj.getBoolean("isVip"); // 布尔字段:true
System.out.println("单层JSON解析结果:姓名=" + name + ",年龄=" + age + ",是否会员=" + isVip);
// ============ 2. 解析【多层嵌套JSON】获取字段(重点,比如user.userName) ============
String complexJson = "{\"orderId\":\"O10001\",\"user\":{\"userId\":1001,\"userName\":\"李四\",\"address\":\"北京市朝阳区\"},\"goods\":[{\"goodsId\":\"G001\",\"goodsName\":\"手机\",\"price\":5999}],\"totalPrice\":6298}";
JSONObject complexObj = JSON.parseObject(complexJson);
// ① 获取一级字段(直接获取)
String orderId = complexObj.getString("orderId"); // O10001
Integer totalPrice = complexObj.getInteger("totalPrice"); // 6298
// ② 获取嵌套字段(核心:先获取内层JSONObject,再取值)
JSONObject userObj = complexObj.getJSONObject("user"); // 获取user对应的内层JSON
String userName = userObj.getString("userName"); // 李四
String address = userObj.getString("address"); // 北京市朝阳区
System.out.println("嵌套JSON解析结果:订单号=" + orderId + ",用户名=" + userName + ",总价=" + totalPrice);
// ============ 3. 解析【JSON数组】获取字段(重点,比如goods数组里的元素) ============
JSONArray goodsArray = complexObj.getJSONArray("goods"); // 获取goods数组
// 方式A:遍历数组,获取每个元素的字段
for (int i = 0; i < goodsArray.size(); i++) {
JSONObject goodsObj = goodsArray.getJSONObject(i); // 数组的每个元素都是JSONObject
String goodsName = goodsObj.getString("goodsName");
Integer price = goodsObj.getInteger("price");
System.out.println("数组元素:商品名=" + goodsName + ",价格=" + price);
}
// 方式B:获取数组指定下标元素的字段(比如获取第0个商品名称)
String firstGoodsName = goodsArray.getJSONObject(0).getString("goodsName"); // 手机
System.out.println("数组第一个商品名:" + firstGoodsName);
}
}
✅ 关键 API 速记(Fastjson)
- 字符串转 JSON 对象:
JSON.parseObject(jsonStr)→ 返回JSONObject - 获取一级字段:
jsonObj.getString("key")、getInteger("key")、getBoolean("key") - 获取嵌套对象:
jsonObj.getJSONObject("嵌套key") - 获取 JSON 数组:
jsonObj.getJSONArray("数组key") - 遍历数组:
数组.size()+数组.getJSONObject(index)
方式二:使用 SpringBoot 自带的 Jackson 解析(⭐⭐⭐⭐⭐ 推荐,无依赖,最优雅)
✅ 优点
- 零额外依赖:SpringBoot 项目中天生自带 Jackson,不需要引入任何 jar 包,直接用!
- 官方推荐:SpringBoot 的
@RestController返回 JSON、@RequestBody接收 JSON,底层都是 Jackson; - 两种使用姿势:① 像 Fastjson 一样按需获取字段 ② 转实体类获取字段(推荐业务开发);
- 性能优秀,稳定性极高,无漏洞风险,金融 / 保险等大厂核心项目首选。
✅ 缺点
按需获取字段的语法,比 Fastjson 多一行代码,仅此而已。
✅ 方式 :Jackson 按需获取指定字段(不转实体,适合临时解析 / 字段少的场景)
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
// SpringBoot项目中可以直接注入ObjectMapper,普通Java项目new即可
@Component
public class JacksonTest {
// 全局ObjectMapper对象,可复用
private static final ObjectMapper objectMapper = new ObjectMapper();
public static void main(String[] args) throws Exception {
String simpleJson = "{\"name\":\"张三\",\"age\":28,\"gender\":\"男\"}";
String complexJson = "{\"orderId\":\"O10001\",\"user\":{\"userName\":\"李四\"},\"goods\":[{\"goodsName\":\"手机\"}]}";
// ============ 1. 解析单层JSON ============
JsonNode simpleNode = objectMapper.readTree(simpleJson);
String name = simpleNode.get("name").asText(); // 转字符串
int age = simpleNode.get("age").asInt(); // 转数字
System.out.println("Jackson单层解析:" + name + "," + age);
// ============ 2. 解析多层嵌套JSON ============
JsonNode complexNode = objectMapper.readTree(complexJson);
String orderId = complexNode.get("orderId").asText();
// 嵌套字段:链式调用 get("内层key")
String userName = complexNode.get("user").get("userName").asText();
System.out.println("Jackson嵌套解析:" + orderId + "," + userName);
// ============ 3. 解析JSON数组 ============
JsonNode goodsArray = complexNode.get("goods");
// 遍历数组
for (JsonNode goodsNode : goodsArray) {
String goodsName = goodsNode.get("goodsName").asText();
System.out.println("Jackson数组解析:" + goodsName);
}
// 获取数组指定下标的字段
String firstGoods = goodsArray.get(0).get("goodsName").asText();
}
}
更多推荐
所有评论(0)