目录
一、常用方法
官方文档:https://github.com/alibaba/fastjson/wiki/Quick-Start-CN
1. 导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>x.x.x</version>
</dependency>
其中x.x.x是版本号
2. 常用的方法
1. Java字符串的转化
Java字符串 -> Json数组
JSONArray jsonArray = JSONArray.parseArray(arrayJsonStr);
Json字符串 -> Json对象
JSONObject parse = (JSONObject) JSON.parse(jsonStr);
Java字符串 -> Java对象
T obj = JSONObject.parseObject(jsonStr, T.class);
Java字符串 -> Java对象集合
List<T> list= JSONArray.parseArray(jsonStr, T.class);
2. Java对象的转化
Java对象 -> Java字符串(Json样式)
public static void main(String[] args) {
/**
* {
* "jump_wxa":
* {
* "path": "/pages/publishHomework/publishHomework",
* "query": "",
* "env_version": "release"
* },
* "is_expire":true,
* "expire_type":1,
* "expire_interval":1
* }
*/
Map<String, Object> paramMap = new HashMap<>();
JumpWxaVo jump_wxa = new JumpWxaVo();
jump_wxa.setPath("/pages/publishHomework/publishHomework");
jump_wxa.setQuery("a=a");
jump_wxa.setEnv_version("release");
paramMap.put("jump_wxa",jump_wxa);
paramMap.put("expire_type", 1);
paramMap.put("is_expire", true);
paramMap.put("expire_interval", 1);
System.out.println(JSONObject.toJSONString(paramMap));
/**
* {
* "jump_wxa": {
* "env_version": "release",
* "path": "/pages/publishHomework/publishHomework",
* "query": "a=a"
* },
* "is_expire": true,
* "expire_interval": 1,
* "expire_type": 1
* }
*/
}
String jsonStr = JSONObject.toJSONString(java对象);
Java对象 -> Json对象
JSONObject jsonObj = (JSONObject) JSONObject.toJSON(java对象);
3. Json对象的转化
Json对象 -> Java字符串
String jsonStr = jsonObj.toJSONString();
Json对象 -> Java对象
T obj= JSONObject.toJavaObject(jsonObj, T.class);
二、实战
具体的要求如下:
外部的请求,返回的数据的格式如下:
{
"code": "200",
"message": "成功",
"result": {
"records": [
{
"id": "9",
"name": "大米"
},
{
"id": "10",
"name": "小米"
}
]
},
"success": "true"
}
要求通过获取 records
里面的 商品 id。通过 id,在数据库查询出每个商品的价格。
思路如下
我这边主要用的就是 Alibaba 的 fastjson 。
-
将返回来的字符串转化为JSON对象;取 result 这个key的 value:records;
-
这个 records 可以看出是个list(有两个 []),list里面就是有很多这种样子的{“id”: “”,“name”: “”}的数据,java不是万物都是对象嘛,就把他转化为对象,如Result。
@Data
public class Result {
/**
* 编码
*/
private String id;
/**
* 名称
*/
private String name;
}
由此可得,我们就是要把 records 转化为 一个 List<Result> results。这样就方便我们去取的id。
- 要求 “通过 id,在数据库查询出每个商品的价格。”。这里就有两种思路:采用的是方法2
- for循环遍历出id,再通过id去查数据库。(有多少条数据,就查询多少次数据库)
- 通过jdk8的stream流,获取出id的Set集合,通过这个集合去查数据。(查询一次数据库)
感兴趣的可以去研究一下两种的差异:从多少条数据开始差异变大;影响的因素有哪一些等等
实战代码如下
@Test
public void test() {
String dataAnalysisResult = "{\"code\":\"200\",\"message\":\"成功\",\"result\":{\"records\":[{\"id\":\"9\",\"name\":\"大米\"},{\"id\":\"10\",\"name\":\"小米\"}]},\"success\":\"true\"}";
JSONObject dataAnalysisJson = JSONObject.parseObject(dataAnalysisResult);
JSONObject result = (JSONObject) dataAnalysisJson.get("results");
if (StringUtils.isNull(result)){
System.out.println( "返回格式错误");
}
// 1. 将返回来的字符串转化为JSON对象;取 result 这个key的 value:records;
String records = result.get("records").toString();
if (StringUtils.isNull(records)){
System.out.println( "返回格式错误");
}
// 2. records 转化为 一个 List<Result> results
List<Result> results = JSONArray.parseArray(records, Result.class);
// 3. 获取出id的Set集合
Set<Long> id= results .stream()
.map(x -> x.getId())
.collect(Collectors.toSet());
// 4. 查出id对应的商品价格
List<Goods> list= goodsService.selectGoodsListById(id);
}
GoodsMapper.java
public List<Goods> selectGoodsListById(@Param("id") Set<Long> id);
GoodsMapper.xml
<select id="selectGoodsListById" resultType="com.h.vo.Goods">
select id , price
from goods
where id in
<foreach item="id" collection="param1" open="(" separator="," close=")">
#{id}
</foreach>
</select>
对应的数据库语句如下:
select id , price
FROM goods
WHERE id in ( '9' , '10');
注意
步骤2 这边会有一个踩雷点:
// 2. records 转化为 一个 List<Result> results
// 这样子转化才是ArrayList的对象
List<Result> results = JSONArray.parseArray(records, Result.class);
// 下图的转化实际上还是一个JSONArray对象
// List<Result> results = (List<Result>) records.get("records");