【JSON】Json与Java对象的互相转化

一、常用方法

官方文档: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 。

  1. 将返回来的字符串转化为JSON对象;取 result 这个key的 value:records;

  2. 这个 records 可以看出是个list(有两个 []),list里面就是有很多这种样子的{“id”: “”,“name”: “”}的数据,java不是万物都是对象嘛,就把他转化为对象,如Result。

@Data
public class Result {
    /**
     * 编码
     */
    private String id;
    /**
     * 名称
     */
    private String name;
}

由此可得,我们就是要把 records 转化为 一个 List<Result> results。这样就方便我们去取的id。

  1. 要求 “通过 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");

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值