fastjson 添加key value_fastjson学习笔记

JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的时候,我们也会将JSON直接保存在数据库中。

可能就有人不太理解,为什么要将JSON保存在关系型数据库中?

我在最开始的时候也有类似的疑惑,问了几个同事,得出的结论都差不多:方便扩展,如果那些字段不需要用到索引,改动比较频繁,你又不想改动表的结构,那就可以在数据库中存入JSON

虽说存JSON会方便扩展,但如果你的MySQL版本还是相对较低的话,想要用SQL查JSON里某个属性,还是比较麻烦的。

并且从数据库里边取出来也仅仅是一个String,而想要操作JSON里边的属性,自己写不太方便,所以就有fastjson给我们去用。

c0314995352fc968f53b568f0bee2197.png

这篇文章简单讲讲fastjson的使用,希望对大家有帮助。如果有帮助,给我点个赞呀!

一、fastjson入门

它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean

cd6279d2bddca32d34a4da4da1c7b5a5.png

说白了就是JSON和Java对象互相转换

fastjson优点:速度快、使用广泛、使用简单、功能完备、测试完备(之前爆了很多漏洞,现在我司走发布流程都强制我们升级fastjson版本了),现在使用fastjson至少升级到1.2.60版本

速度快的原因:

1、自行编写类似StringBuilder的工具类SerializeWriter。

2、使用ThreadLocal来缓存buf。

3、使用asm避免反射

4、集成jdk实现的一些优化算法

二、使用fastjson

首先我们在pom文件中引入fastjson的依赖就好了:

12 com.alibaba3 fastjson4 x.x.x5

fastjson的使用主要是三个对象:

  • JSON
  • JSONObject
  • JSONArray
0e19090edb5da5dbd4aac179f0e7ee31.png

三个类

JSONArray和JSONObject继承JSON:

6f472fdeff0b10ef09697188851406cc.png

JSONArray和JSONObject继承JSON

2.1 JSON对象

JSON这个类主要用于转换

  • 将Java对象序列化为JSON字符串
  • 将JSON字符串反序列化为Java对象

所以,有三个方法我们用得特别多:

  • parseObject(String text, Classclazz)
  • parseArray(String text, Classclazz)
  • toJSONString(Object object)

2.2 JSONObject

JSON对象(JSONObject)中的数据都是以key-value形式出现,所以它实现了Map接口:

5c142cab8dc47ec5e28433aeb2650385.png

实现了Map接口

使用起来也很简单,跟使用Map就没多大的区别(因为它底层实际上就是操作Map),常用的方法:

  • getString(String key)
  • remove(Object key)
46eeac2c774a06294c093058a8cb3012.png

JSONObject有常用的Map方法

2.3 JSONArray

JSONArray则是JSON数组,JSON数组对象中存储的是一个个JSON对象,所以类中的方法主要用于直接操作JSON对象

db9a7946cab09998a7c5453065c535fd.png

实现List接口

最常用的方法:

  • getJSONObject(int index)

三、实战

从上面的简单介绍我们已经可以知道了:

  • JSON用于将字符串反序列化为JavaBean和JavaBean序列化为JSON
  • JSONObject代表的是JSON对象,底层通过Map来操作,常用getString等方法来获取对应的值
  • JSONArray代表的是JSON对象数组,底层实际上是List,它用作于操作JSON对象

一般来说,我们从数据库拿到JSON数据以后,然后要对JSON进行修改。比如JSON串如下:

 1{ 2 "formId": "{$formId}", 3 "link": "www.java3y.com", 4 "text": [{ 5 "name": "java3y", 6 "label": "3y", 7 "value": { 8 "value": "{$tureName}", 9 "color": "",10 "emphasis": ""11 }12 }, {13 "name": "java4y",14 "label": "3y",15 "value": {16 "value": "{$title}",17 "color": "",18 "emphasis": ""19 }20 }, {21 "name": "java5y",22 "label": "5y",23 "value": {24 "value": "关注我的公众号,更多干货",25 "color": "#ff0040",26 "emphasis": ""27 }28 }],29 "yyyImg": "",30 "yyyAge": "",31 "pagepath": ""32}

我们是不会直接操作JSON的,我们会将JSON转成我们自己的JavaBean,再操作JavaBean,最后序列化为JSONString

从上面的JSON结构上来看还是相对复杂的,思路:

  • 我们可以根据JSON的结构构建对应的JavaBean
  • 使用JSON类将JSON字符串反序列化为JavaBean
  • 修改JavaBean的值
  • 最后将JavaBean序列化为JSON字符串

从上面的JSON结构,首先我们针对text这层抽象为一个JavaBean。(实际上最里层的结构是value,但我这边不需要处理value,所以就不抽象了)

 1/** 2 * "name": "java3y", 3 * "label": "3y", 4 * "value": { 5 * "value": "{$tureName}", 6 * "color": "", 7 * "emphasis": "" 8 * } 9 *10 * 对Text进行抽象11 */12public class TextInfo {1314 private String name;15 private String label;1617 // 因为value我这边不需要操作,所以就不抽象了,如果每层都要处理,那就得抽象18 private Object value;192021 // set get ... 省略 欢迎关注我的公众号:Javay2223}

然后对外层进行抽象:

 1public class ContentValue { 2 private String formId; 3 private String link; 4 // 这里是一个数组,我们就抽象为List,属性名为text 5 private List text; 6 7 private String yyyImg; 8 private String yyyAge; 9 private String pagepath;1011 // set get ... 省略 欢迎关注我的公众号:Javay1213}

我们反序列化看一下:

 1public static void main(String[] args) { 2 3 // JSON 字符串 4 String s = "{"formId":"{$formId}","link":"www.java3y.com","text":[{"name":"java3y","label":"3y","value":{"value":"{$tureName}","color":"","emphasis":""}},{"name":"java4y","label":"3y","value":{"value":"{$title}","color":"","emphasis":""}},{"name":"java5y","label":"5y","value":{"value":"关注我的公众号,更多干货","color":"#ff0040","emphasis":""}}],"yyyImg":"","yyyAge":"","pagepath":""}"; 5 6 // 使用JSON对象 将JSON字符串反序列化为JavaBean 7 ContentValue contentValue = JSON.parse(s, ContentValue.class); 8 System.out.println(contentValue); 91011 }

反序列化结果:

41f3bb260620e8f6a1ea3e19c0951cab.png

反序列化

我们要改text里边的值,只需要操作JavaBean就好了:

 1public static void main(String[] args) { 2 3 // JSON 字符串 4 String s = "{"formId":"{$formId}","link":"www.java3y.com","text":[{"name":"java3y","label":"3y","value":{"value":"{$tureName}","color":"","emphasis":""}},{"name":"java4y","label":"3y","value":{"value":"{$title}","color":"","emphasis":""}},{"name":"java5y","label":"5y","value":{"value":"关注我的公众号,更多干货","color":"#ff0040","emphasis":""}}],"yyyImg":"","yyyAge":"","pagepath":""}"; 5 6 // 使用JSON对象 将JSON字符串反序列化为JavaBean 7 ContentValue contentValue = JSON.parse(s, ContentValue.class); 8 List text = contentValue.getText(); 9 for (TextInfo textInfo : text) {10 textInfo.setName("Java3y");11 textInfo.setLabel("关注我的公众号呗");12 }131415 // 修改后,反序列化回去16 String content = JSON.toJSONString(contentValue);17}

序列化结果:

8972a291c0222ec202a1a806ce459abc.png

序列化

轻松将JSON字符串里边的字段改掉。

最后

总的来说,fastjson还是足够方便好用的,它的速度也很快,只是最近漏洞有点多。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: fastjson是一个用于处理JSON数据的Java库,它提供了丰富的API,可以方便地对JSON数据进行解析、序列化和操作。 要获取JSON数据中的key,可以使用fastjson提供的JSONObject类的方法。JSONObject类表示一个JSON对象,它可以根据提供的JSON字符串创建一个JSONObject对象,然后通过调用其相应的方法来获取JSON数据中的key。 例如,假设有以下JSON字符串: { "name": "张三", "age": 20, "gender": "男" } 可以使用fastjson的JSONObject类来获取key。示例代码如下: ```java import com.alibaba.fastjson.JSONObject; public class FastJsonDemo { public static void main(String[] args) { String jsonString = "{\"name\":\"张三\",\"age\":20,\"gender\":\"男\"}"; JSONObject jsonObject = JSONObject.parseObject(jsonString); for (String key : jsonObject.keySet()) { System.out.println("Key: " + key); } } } ``` 运行上述代码,将输出以下结果: Key: name Key: age Key: gender 以上代码中,首先通过JSONObject.parseObject方法将JSON字符串解析为一个JSONObject对象。然后,通过调用jsonObject的keySet方法,可以获取JSON数据中的所有key,并使用for循环遍历输出每个key。 注意,如果JSON数据中存在嵌套的JSONObject或JSONArray,可以使用其他方法递归处理获取所有的key。 ### 回答2: fastjson是一种Java开发中常用的JSON处理工具,它提供了丰富的API用于解析和操作JSON数据。要获取fastjson对象中的某个key值,可以按照以下步骤进行操作: 首先,需要将JSON字符串转换为fastjson对象。可以使用fastjson中的`JSONObject.parseObject()`方法将JSON字符串解析为一个JSONObject对象。例如: ``` String jsonStr = "{\"key1\":\"value1\",\"key2\":\"value2\"}"; JSONObject jsonObject = JSONObject.parseObject(jsonStr); ``` 接下来,可以使用`JSONObject`的`get()`方法来获取特定key对应的值。该方法接受一个字符串参数,即要获取的key值。例如: ``` String value1 = jsonObject.get("key1").toString(); System.out.println(value1); // 输出value1 ``` 也可以使用`JSONObject`的`keySet()`方法获取所有的key值,然后通过遍历的方式逐个获取对应的值。例如: ``` for(String key : jsonObject.keySet()) { String value = jsonObject.get(key).toString(); System.out.println(key + ":" + value); } ``` 以上就是使用fastjson获取key值的基本步骤。根据具体情况,可以按照需求进行其他操作,如判断key是否存在、获取嵌套结构中的key等。需要注意的是,fastjson提供了多种方法来获取key值,开发者可以根据实际情况选择合适的方法进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值