许多java开发人员对于fastjson再也熟悉不过了,这是alibaba开源的依赖,使用fastjson可以使我们很容易的把请求json串转换成为我们所需要的对象、list、map等对象格式,对于开发带来了很多的遍历,具体的详细操作就不详细介绍了。

下面进入我们的正题,最近开发项目和学习中封装了一个JSONUtil类,使用也挺方便,所以就给大家分享一下吧!

package cn.itwx.mybatis.common;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
//import com.sun.istack.internal.Nullable;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.lang.Nullable;import java.io.IOException;
import java.util.List;
import java.util.Map;/*** @author: qxy* @create: 2018-04-24 17:20**/
public class JsonUtils {public static final ObjectMapper mapper = new ObjectMapper();private static final Logger logger = LoggerFactory.getLogger(JsonUtils.class);/*** 将对象转换成json格式* @param obj* @return*/@Nullablepublic static String serialize(Object obj) {if (obj == null) {return null;}if (obj.getClass() == String.class) {return (String) obj;}try {return mapper.writeValueAsString(obj);} catch (JsonProcessingException e) {logger.error("json序列化出错:" + obj, e);return null;}}/*** 将json转换成对象的格式* @param json* @param tClass* @param <T>* @return*/@Nullablepublic static <T> T parse(String json, Class<T> tClass) {try {return mapper.readValue(json, tClass);} catch (IOException e) {logger.error("json解析出错:" + json, e);return null;}}/*** 将一个json转换成list* @param json* @param eClass* @param <E>* @return*/@Nullablepublic static <E> List<E> parseList(String json, Class<E> eClass) {try {return mapper.readValue(json, mapper.getTypeFactory().constructCollectionType(List.class, eClass));} catch (IOException e) {logger.error("json解析出错:" + json, e);return null;}}/*** 将json解析成map* @param json* @param kClass* @param vClass* @param <K>* @param <V>* @return*/@Nullablepublic static <K, V> Map<K, V> parseMap(String json, Class<K> kClass, Class<V> vClass) {try {return mapper.readValue(json, mapper.getTypeFactory().constructMapType(Map.class, kClass, vClass));} catch (IOException e) {logger.error("json解析出错:" + json, e);return null;}}/*** 解析复杂类型的json串,适用以上所有的格式* @param json* @param type* @param <T>* @return*/@Nullablepublic static <T> T nativeRead(String json, TypeReference<T> type) {try {return mapper.readValue(json, type);} catch (IOException e) {logger.error("json解析出错:" + json, e);return null;}}
}

2、为了验证json解析格式是否正确,所以我专门在这个类里面定义一个内部类和方法验证,附上源代码,有兴趣的小伙伴们可以亲自操作一下。

对于这段代码中可能会有小伙伴对于@Data、@Nullable\@NoArgsConstructor等注解会感到困惑,这些事lombok的注解方式,有兴趣或者技术大佬可以下面留言大家一些说下他的用法,这里小编先不叙述了,等待详解哦

public class JsonUtils {......//省去上面的封装方法//内部类@Data   //次注解可以省去类中的set\get方法@NoArgsConstructor//注解无参构造@AllArgsConstructor//有参构造static class User{String name;int age;}
//定义的主方法public static void main(String[] args) {User user = new User("lisi",23);//json序列化:将对象转换为json串String json = serialize(user);System.out.println("json="+json);//json反序列化:将json串转换成对象User parse = parse(json, User.class);System.out.println("user=" + parse);//将json转换成对象listString json = "[12,23,63,64]";List<Integer> integers = parseList(json, Integer.class);System.out.println("list="+integers);String userJson = "[{\"name\":\"lisi\",\"age\":21},{\"name\":\"ahua\",\"age\":32},{\"name\":\"llk\",\"age\":23}]";//自定义JOSNUtil工具类List<User> users = parseList(userJson, User.class);System.out.println("users=" + users);//使用JSON类List<User> userList = JSON.parseArray(userJson, User.class);System.out.println("userList =" + userList);//使用JSON的子类,JSONArrayList<User> list = JSONArray.parseArray(userJson, User.class);System.out.println("List = "+ list);//将json转换成map//language=JSONString json = "{\"name\":\"Jack\",\"age\":\"23\"}";Map<String, String> map = parseMap(json, String.class, String.class);System.out.println("map:"+map);//json串为map复杂类型//language=JSONString json = "[{\"name\":\"ROSE\",\"age\":\"32\"},{\"name\":\"jack\",\"sex\":\"m\"}]";List<Map<String, String>> maps = nativeRead(json, new TypeReference<List<Map<String, String>>>() {});//匿名内部类//循环Listfor (Map<String ,String> map : maps){System.out.println("map="+map);}
}

细心的小伙伴们可能会发现我同时用了fastjson去解析串,目的就是验证这个工具类是否解析的格式有问题,所以有疑问或者有问题的伙伴们及时沟通哈!

《JSON笔记之二》----封装JSONUtil相关推荐

  1. extjs 提交表单给php,JavaScript_Extjs学习笔记之二 初识Extjs之Form,Extjs中的表单组件是Ext.form.Basic - phpStudy...

    Extjs学习笔记之二 初识Extjs之Form Extjs中的表单组件是Ext.form.BasicForm,不过最简单最常用的是Ext.form.FormPanel控件,它继承自Panel,具有一 ...

  2. 软件测试52讲 - 笔记(二)-GUI自动化测试篇

    软件测试52讲 - 笔记(二)- GUI自动化测试篇 12|从0到1:你的第一个GUI自动化测试 Selenium 的实现原理 总结 Selenium 1.0 的工作原理 Selenium RC 的执 ...

  3. Redis学习笔记(二)SpringBoot整合

    Redis学习笔记(二) SpringBoot整合 测试 导入依赖 查看底层 配置连接 测试连接 自定义`RedisTemplate` 在开发中,一般都是以json来传输对象: 所以实际开发中所有对象 ...

  4. 谷粒商城--秒杀服务--高级篇笔记十二

    谷粒商城–秒杀服务–高级篇笔记十二 1.后台添加秒杀商品 未配置秒杀服务相关网关 1.1 配置网关 - id: coupon_routeuri: lb://gulimall-couponpredica ...

  5. TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅

    TensorFlow学习笔记(二):快速理解Tutorial第一个例子-MNIST机器学习入门 标签: 机器学习SoftmaxTensorFlow教程 2016-08-02 22:12 3729人阅读 ...

  6. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  7. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  8. 软件调试学习笔记(二)—— 调试事件的采集

    软件调试学习笔记(二)-- 调试事件的采集 要点回顾 调试事件的种类 调试事件采集函数 例:分析PspUserThreadStartup 例:分析PspExitThread 总结 要点回顾 调试器与被 ...

  9. 硬编码学习笔记(二)—— 经典变长指令

    硬编码学习笔记(二)-- 经典变长指令 前言 指令结构 符号说明 寻址符号 操作数符号 上标符号 One-Byte Opcode Map 变长指令 ModR/M 例:0x88 例:0x89 例:0x8 ...

最新文章

  1. 亿图图示线条不要箭头
  2. cocos2dx 2.2.5 hitWidget-onTouchEnded(pTouch, pEvent); 异常
  3. Django使用心得(四)
  4. [Leetcode]@python 68. Text Justification
  5. Error:File read error (source insight 4.0错误)
  6. CF385C Bear and Prime Numbers 数学
  7. 新春牛年迎春PSD分层模板!最全设计素材都在这了
  8. 洛谷.3065.第一!First!(Trie 拓扑)
  9. 不能访问共享-The network location cannot be reached
  10. linux系统鼠标主题下载,Ubuntu Linux鼠标主题:AlkanoMB
  11. 易飞ERP工作流解决方案之【第三方OA系统集成】
  12. 新媒体文章标题怎么写?
  13. 0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)
  14. H3CNE-生成树协议(STP)
  15. 《TPM原理及应用指南》深入研读 —— TPM介绍
  16. 如何通过linux的终端命令远程登陆windows主机
  17. c语言中u8,u16,u32和int区别
  18. 第六节课 pycharm
  19. SimulinkSTM32开发(一)开发环境搭建
  20. 读书笔记:《探索大脑的内部世界》

热门文章

  1. 杭州SEO大熊:百度分享插件的SEO研究心得
  2. vocabulary of ERP
  3. LeetCode 627. 交换工资
  4. 深入理解Mysql - 事务与锁原理
  5. 删除字符串中指定的字符形成字符串
  6. akka actor行为切换实现
  7. TCP 粘包半包 netty 编解码 三者关系
  8. windows 自动备份mysql方案
  9. 从源码分析RocketMQ系列-Producer的SendResult来自哪里?
  10. 想重装java jdk_jdk怎么重新安装