Java中JSON解析的3种常用方法详解,附完整代码示例
日期:2025-05-19 11:36:21 •原创
你是不是也在为处理JSON数据头疼?刚学Java的新手小白可能都遇到过这种困扰——服务端返回的JSON数据该怎么解析?网上教程一堆却看不懂?今天咱们就用最接地气的方式,手把手教你3种常用方法。别说新手如何快速涨粉了,学会这个才是程序员涨薪的硬技能!
??先搞懂为什么需要JSON解析??
现在随便找个接口返回的都是JSON格式数据,比如用户信息长这样:
json复制{"name":"张三","age":25,"hobby":["篮球","编程"]}
Java可不能直接操作这串字符,得把它转成对象才能用。这就好比你要吃核桃,得先砸开壳对吧?
方法一:原生JSONObject(简单但麻烦)
适合临时处理小数据量,Android开发常用。直接上代码:
java复制// 记得导包 org.json.* String jsonStr = "{\"name\":\"张三\",\"age\":25}"; JSONObject obj = new JSONObject(jsonStr); System.out.println("姓名:" + obj.getString("name")); // 输出张三 System.out.println("年龄:" + obj.getInt("age")); // 输出25
??要注意的坑??:
- 遇到嵌套数据得层层解析,比如取hobby数组得:
java复制JSONArray hobbyArr = obj.getJSONArray("hobby"); String firstHobby = hobbyArr.getString(0);
- 字段不存在直接报错,得用optString这类安全方法
- 处理复杂数据结构时代码会变得很臃肿
方法二:Gson(谷歌大法好)
这个库用起来是真香,先添加依赖:
xml复制<dependency> <groupId>com.google.code.gsongroupId> <artifactId>gsonartifactId> <version>2.8.9version> dependency>
假设有个User类:
java复制public class User { private String name; private int age; // 必须要有空构造器! // getter/setter省略... }
解析代码简单到哭:
java复制Gson gson = new Gson(); User user = gson.fromJson(jsonStr, User.class); System.out.println(user.getName()); // 还是张三
??特别适合的场景??:
- 需要把整个JSON转成Java对象时
- 字段有下划线转驼峰的需求(比如user_name自动转userName)
- 要处理日期格式这种特殊字段
方法三:Jackson(性能扛把子)
企业级应用最爱,SpringBoot默认集成。先导包:
xml复制<dependency> <groupId>com.fasterxml.jackson.coregroupId> <artifactId>jackson-databindartifactId> <version>2.13.1version> dependency>
使用姿势:
java复制ObjectMapper mapper = new ObjectMapper(); User user = mapper.readValue(jsonStr, User.class);
??为什么说它强??:
- 处理百万级数据时速度比Gson快30%左右
- 支持流式解析(JsonParser)
- 丰富的注解功能,比如@JsonIgnore忽略字段
??新手常见问题自问自答??:
Q:这仨方法到底哪个好?
A:看需求!临时用选JSONObject,要方便用Gson,处理大数据必须Jackson。好比吃饭用筷子,喝汤用勺子,没有绝对的好坏。
Q:为什么我的字段值总是null?
- 检查getter/setter是否齐全
- 字段名是否和JSON完全一致(注意大小写)
- 试试给ObjectMapper配置:mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY)
Q:遇到复杂嵌套结构怎么办?
比如这种数据:
json复制{ "department":{ "name":"技术部", "members":[ {"name":"李四","level":3}, {"name":"王五","level":5} ] } }
用Jackson可以这样处理:
java复制public class Department { private String name; private List
members; // 省略getter/setter } public class Member { private String name; private int level; } // 解析时直接映射 Department dept = mapper.readValue(jsonStr, Department.class);
??小编观点??:
刚入门建议先用Gson,等熟悉了再玩Jackson。别听那些上来就让你学复杂框架的,编程和健身一样,得循序渐进。下次遇到JSON解析问题,把这篇文章翻出来对照着改代码,保管你半小时内搞定!
本文由嘻道妙招独家原创,未经允许,严禁转载