在 java 里处理接口返回的 json,最常用的是 jackson 或 gson 这两个库。下面我用最简单、最实用的方式教你:拿到接口返回的 json 字符串 → 转成 java 对象 / map → 直接取值。
一、先引入依赖(二选一)
1. 使用 jackson(spring 默认,最常用)
maven:
<dependency>
<groupid>com.fasterxml.jackson.core</groupid>
<artifactid>jackson-databind</artifactid>
<version>2.15.2</version>
</dependency>2. 使用 gson(谷歌出品,轻量)
maven:
<dependency>
<groupid>com.google.code.gson</groupid>
<artifactid>gson</artifactid>
<version>2.10.1</version>
</dependency>二、假设接口返回 json 如下
{
"code": 200,
"msg": "请求成功",
"data": {
"id": 1001,
"username": "zhangsan",
"age": 25
}
}三、方式 1:json → java 对象(最规范)
1. 先建实体类
import lombok.data;
// 整体返回结构
@data
public class apiresult {
private integer code;
private string msg;
private user data;
}
// data 里的用户对象
@data
public class user {
private integer id;
private string username;
private integer age;
}不用 lombok 就手写 getter/setter。
2. jackson 解析
import com.fasterxml.jackson.databind.objectmapper;
public class jsontest {
public static void main(string[] args) throws exception {
// 接口返回的 json 字符串
string json = "{\"code\":200,\"msg\":\"请求成功\",\"data\":{\"id\":1001,\"username\":\"zhangsan\",\"age\":25}}";
objectmapper mapper = new objectmapper();
apiresult result = mapper.readvalue(json, apiresult.class);
// 直接取值
system.out.println(result.getcode()); // 200
system.out.println(result.getmsg()); // 请求成功
system.out.println(result.getdata().getusername()); // zhangsan
}
}
3. gson 解析
import com.google.gson.gson;
public class jsontest {
public static void main(string[] args) {
string json = "{\"code\":200,\"msg\":\"请求成功\",\"data\":{\"id\":1001,\"username\":\"zhangsan\",\"age\":25}}";
gson gson = new gson();
apiresult result = gson.fromjson(json, apiresult.class);
system.out.println(result.getcode());
system.out.println(result.getdata().getusername());
}
}
四、方式 2:json → map(快速取值,不用建类)
适合不想写实体类、临时解析的场景。
jackson 转 map
objectmapper mapper = new objectmapper();
map<string, object> map = mapper.readvalue(json, map.class);
int code = (int) map.get("code");
string msg = (string) map.get("msg");
map<string, object> data = (map) map.get("data");
string username = (string) data.get("username");
gson 转 map
gson gson = new gson();
map<string, object> map = gson.fromjson(json, map.class);
double code = (double) map.get("code"); // gson 数字默认 double
string username = (string) ((map) map.get("data")).get("username");
五、结合你刚才的 post 请求完整示例
把 post 请求 + json 解析放一起:
import java.net.uri;
import java.net.http.httpclient;
import java.net.http.httprequest;
import java.net.http.httpresponse;
import com.fasterxml.jackson.databind.objectmapper;
public class postwithjsonparse {
public static void main(string[] args) throws exception {
string url = "https://httpbin.org/post";
string jsonparams = "{\"username\":\"test\",\"password\":\"123456\"}";
httpclient client = httpclient.newhttpclient();
httprequest request = httprequest.newbuilder()
.uri(uri.create(url))
.post(httprequest.bodypublishers.ofstring(jsonparams))
.header("content-type", "application/json")
.build();
// 获取返回 json
httpresponse<string> response = client.send(request, httpresponse.bodyhandlers.ofstring());
string json = response.body();
// 解析 json
objectmapper mapper = new objectmapper();
map<string, object> resultmap = mapper.readvalue(json, map.class);
system.out.println("url: " + resultmap.get("url"));
system.out.println("data: " + resultmap.get("data"));
}
}
六、常见小问题
字段名不一致:用 @jsonproperty("user_name")
json 数组:转 list<实体类>
jackson:list<user> list = mapper.readvalue(json, new typereference<>(){});
null 值:解析不会报错,会自动为 null
到此这篇关于浅析java中如何处理接口返回的json数据的文章就介绍到这了,更多相关java处理接口返回的json数据内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论