1. 主页 > 好文章

Java中JSON解析的3种常用方法详解,附完整代码示例

你是不是也在为处理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解析问题,把这篇文章翻出来对照着改代码,保管你半小时内搞定!

本文由嘻道妙招独家原创,未经允许,严禁转载