许多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: wx
* @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
*/
@Nullable
public 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
*/
@Nullable
public 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
*/
@Nullable
public 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
*/
@Nullable
public 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
*/
@Nullable
public 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转换成对象list
String 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的子类,JSONArray
List<User> list = JSONArray.parseArray(userJson, User.class);
System.out.println("List = "+ list); //将json转换成map
//language=JSON
String json = "{\"name\":\"Jack\",\"age\":\"23\"}";
Map<String, String> map = parseMap(json, String.class, String.class);
System.out.println("map:"+map); //json串为map复杂类型
//language=JSON
String json = "[{\"name\":\"ROSE\",\"age\":\"32\"},{\"name\":\"jack\",\"sex\":\"m\"}]";
List<Map<String, String>> maps = nativeRead(json, new TypeReference<List<Map<String, String>>>() {
});//匿名内部类 //循环List
for (Map<String ,String> map : maps){
System.out.println("map="+map);
}
}

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

《JSON笔记之二》----封装JSONUtil的更多相关文章

  1. Directx11学习笔记【二十一】 封装键盘鼠标响应类

    原文:Directx11学习笔记[二十一] 封装键盘鼠标响应类 摘要: 本文由zhangbaochong原创,转载请注明出处:http://www.cnblogs.com/zhangbaochong/ ...

  2. 《Data-Intensive Text Processing with mapReduce》读书笔记之二:mapreduce编程、框架及运行

    搜狐视频的屌丝男士第二季大结局了,惊现波多野老师,怀揣着无比鸡冻的心情啊,可惜随着剧情的推进发展,并没有出现期待中的屌丝奇遇,大鹏还是没敢冲破尺度的界线.想百度些种子吧,又不想让电脑留下污点证据,要知 ...

  3. 《C++游戏开发》笔记十二 战争迷雾:初步实现

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9475979 作者:七十一雾央 新浪微博:http:/ ...

  4. [.NET] 《Effective C#》读书笔记(二)- .NET 资源托管

    <Effective C#>读书笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...

  5. strut2-学习笔记(二)

     Struts2学习笔记(二) 1. 自定义结果视图的类型(结果视图类型的应用) CAPTCHA图像(随机验证码图像) 实现步骤: (1)编写一个类实现com.opensymphony.xwork ...

  6. [.NET] 《Effective C#》快速笔记(二)- .NET 资源托管

    <Effective C#>快速笔记(二)- .NET 资源托管 简介 续 <Effective C#>读书笔记(一)- C# 语言习惯. .NET 中,GC 会帮助我们管理内 ...

  7. Apollo源码阅读笔记(二)

    Apollo源码阅读笔记(二) 前面 分析了apollo配置设置到Spring的environment的过程,此文继续PropertySourcesProcessor.postProcessBeanF ...

  8. WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]

    WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...

  9. 《C++标准程序库》笔记之二

    <C++标准程序库>笔记之二 本篇博客笔记顺序大体按照<C++标准程序库(第1版)>各章节顺序编排. ------------------------------------- ...

随机推荐

  1. jQuery的实现编码,解决特殊字符 <script> "

    function htmlEncode(value){ if (value) { return jQuery('<div />').text(value).html(); } else { ...

  2. eclipse编码转换

    一般Java文件编码格式是UTF-8的.以下以默认GBK改为UTF-8为例. 1.改变整个工作空间的编码格式,这样以后新建的文件也是新设置的编码格式.     eclipse->window-& ...

  3. WCF:无法满足对安全令牌的请求,因为身份验证失败。

    服务端和客户端如果有认证的话的这样: <wsHttpBinding> <binding name="WSHttpBinding_IService1" closeT ...

  4. 使用Ribbon Workbench来修改停用、激活按钮的权限

    在实施的过程中,有时会遇到客户为了管控使用人员的操作或防止使用人员通过停用后再激活来绕开部分逻辑,需要对激活.停用按钮赋予单独的权限.但很遗憾,在Dyanmics CRM中,并没有把停用.激活按钮单独 ...

  5. Debug get/set property

    1. Select "Debug -> Windows -> Breakpoints" from VS menu. 2. Click "New -> B ...

  6. 我的Android开发之路——百度地图开源工具获取定位信息

    定位技术在现在的移动设备上是必不可少的,许多app都会使用定位功能. 通常定位方式有两种:GPS定位:网络定位. Android系统对这两种定位方式都提供了相应的API支持,但是因为google的网络 ...

  7. Struts_OGNL(Object Graph Navigation Language) 对象图导航语言

    1.访问值栈中的action的普通属性: 请求: <a href="ognl.action?username=u&password=p">访问属性</a& ...

  8. 爆料!如何在Visual Studio 2017上体验五星级云服务

    2017 年 3 月初,号称宇宙最强 IDE 之一的 Visual Studio 发布了最新的 2017 版本,遥想自己使用 VC++ 6.0 的当年,看着现在已然稀疏的头发,真是一入 IT 似海深, ...

  9. C#对bat脚本文件的操作示例

    实现C#操作bat脚本文件 using System;using System.Collections.Generic;using System.ComponentModel;using System ...

  10. ASP.NET 上传图片到FTP

    目录: 2.代码 3.参考资料 4.IIS环境FTP配置 5.使用虚拟目录注意Server.MapPath() 1. 项目介绍 建立FTP文件服务器与应用程序分开. 下面方法中的参数为Stream因为 ...