JSON 解析 (一)—— FastJSON的使用
FastJSON是一个高性能、功能完善的json序列化和解析工具库,可使用Maven添加依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
一、序列化
FastJSON提供了多个序列化的方法
1、基本的序列化
String json = JSON.toJSONString(Object object);
2、字符串格式化
String json = JSON.toJSONString(Object object, boolean prettyFormat); // 当prettyFormat为true
String json = JSON.toJSONString(Object object, SerializerFeature... features) // 当SerializerFeature为PrettyFormat
3、日期格式化
String json = JSON.toJSONString(new Date()); //
String json = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat); // "2018-03-22 10:30:30"
String json = JSON.toJSONStringWithDateFormat(new Date(), "yyyy-MM-dd"); // "2018-03-22"
4、输出null字段
默认情况下,FastJSON不输出值为null的字段,可以使用SerializerFeature.WriteMapNullValue使其输出
String json = JSON.toJSONString(Object object, SerializerFeature... features) // 当SerializerFeature为WriteMapNullValue
5、数字的格式化
Map<String, Object> map = new HashMap<String, Object>();
map.put("key1", 3.3696587);
map.put("key2", "abc"); SerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();
serializeConfig.put(Double.class, new DoubleSerializer("#.##"));
System.out.println(JSON.toJSONString(map)); // {"key2":"abc","key1":3.37}
6、自定义指定类型的格式化
SerializeConfig serializeConfig = new SerializeConfig();
serializeConfig.put(Double.class, new ObjectSerializer() {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName,
Type fieldType, int features) throws IOException {
serializer.out.write(String.format("%.2f", (Double)object));
}
});
System.out.println(JSON.toJSONString(map, serializeConfig)); // {"key2":"abc","key1":3.37}
详细可参考ObjectSerializer代码中的官方注释
7、自定义字段输出
保留最外层实体中为null的字段,其他字段忽略
Map<String, Object> map = new HashMap<>();
Map<String, Object> subMap = new HashMap<>();
map.put("hello", "world");
map.put("age", null);
subMap.put("aa", "123");
subMap.put("bb", null);
map.put("sub", subMap); System.out.println(JSON.toJSONString(map, new PropertyFilter() {
@Override
public boolean apply(Object object, String name, Object value) {
if (object == map || value != null) {
return true;
}
else {
return false;
}
}
}, SerializerFeature.WriteMapNullValue)); // {"sub":{"aa":"123"},"hello":"world","age":null}
详细可参考[转]FastJSON通过SerializeFilter定制序列化
二、反序列化
1、简单的反序列化
UserInfo userInfo = JSON.parseObject(json, UserInfo.class); // 实体可包含泛型字段
2、集合的反序列化
List<UserInfo> tmplist = JSON.parseArray(json, UserInfo.class);
3、泛型的反序列化
List<UserInfo> tmplist = (List<UserInfo>) JSON.parseObject(json, new TypeReference<List<UserInfo>>(){});
4、JSONObject
JSONObject实现了Map<String, Object>接口,并定义了多个获取指定类型值的方法,当不指定类型时,FastSON默认将对象的解析为JSONObject
JSONObject jsonObject = JSON.parseObject(json); // {"age":21,"name":"matt"}
System.out.println(jsonObject.getString("name"));
System.out.println(jsonObject.getInteger("age"));
json字段转换为Object对象,每种json类型均转为特定类型
String json = "[3, 3.0,\"abc\"]";
JSONArray jsonArray = JSON.parseArray(json);
for (Object obj : jsonArray) {
System.out.println(obj.getClass().getSimpleName());
}
// 输出为:Integer BigDecimal String
5、JSONArray
JSONArray实现了List<Object>接口,遍历时的对象为Object类型,使用时须强转为JSONObject类型
JSONArray jsonArray = JSON.parseArray(json); // [{"age":21,"name":"matt"},{"age":15,"name":"kevin"}]
for (Object obj : jsonArray) {
JSONObject jsonObject = (JSONObject) obj;
System.out.println(jsonObject.getString("name"));
}
6、方法参数的反序列化
对于方法的参数可能为泛型的情况,可使用parseObject(String json, Type type, Feature... features)实现反序列化
public class Company {
public void printUsers(List<UserInfo> users) {
for (UserInfo userInfo : users) {
System.out.println(String.format("name:%s, age:%d", userInfo.getName(), userInfo.getAge()));
}
}
}
String json = "[{\"name\":\"matt\",\"age\":21},{\"name\":\"kevin\",\"age\":15}]";
Method method = Company.class.getDeclaredMethods()[0];
Type type = method.getGenericParameterTypes()[0];
method.invoke(new Company(), JSON.parseObject(json, type));
// 输出:
// name:matt, age:21
// name:kevin, age:15
参考:
FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
[转]FastJSON通过SerializeFilter定制序列化
JSON 解析 (一)—— FastJSON的使用的更多相关文章
- Android总结之json解析(FastJson Gson 对比)[申明:来源于网络]
Android总结之json解析(FastJson Gson 对比)[申明:来源于网络] 地址:http://blog.csdn.net/u014031072/article/details/5392 ...
- Android总结之json解析(FastJson Gson 对比)
前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...
- 来自阿里的 json 解析方案 fastjson
说起Json 解析,有非常多方法,不管是出自Google 的Gson也好,还是来自其它的某某.想必大家都非常熟悉. 今日在github上闲逛.偶遇 一 json 解析库.看起来非常不错,据说是眼下最快 ...
- 75、JSON 解析库---FastJson, Gson
JSON 的简介: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.用于数据转换传输, 通用于PHP,Java,C++,C#,Python等编程语言数据交 ...
- Java的Json解析包FastJson使用
阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser. ...
- Android 中的Json解析工具fastjson 、序列化、反序列化
Android中通常需要访问服务器,然而服务器返回的数据很多时候都是Json格式 1.fastjson简介 阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备 ...
- 阿里的Json解析包FastJson使用
阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征: 速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser ...
- Json解析包FastJson使用
阿里巴巴FastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser. ...
- Json解析之FastJson
版权声明:转载请注明出处 https://blog.csdn.net/heqiangflytosky/article/details/37659943 1.FastJson介绍 FastJson是阿里 ...
- JSON解析工具——fastjson的简单使用
从官方文档入手: 常见问题与快速上手:https://github.com/alibaba/fastjson/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98 各种使 ...
随机推荐
- Nginx学习之如何搭建文件防盗链服务
前言 大家都知道现在很多站点下载资料都是要收费的,无论是积分还是金币,想免费只能说很少很少了,那么这些网站是如何做到资源防盗链的呢? 这里推荐一款比较容易上手的神器,Nginx本身提供了secure_ ...
- 天坑之路:用js给选中文字添加样式
前言 本例基于react,但是实际上就是用原生js做的.兼容性做到了IE9,但是按照这个思路做是可以做到IE8甚至更低的. 需求与最初的思路 当我拿到这个需求的时候以为很简单,就是可以给页面上的文章做 ...
- 内网IP外网IP的关联及访问互联网原理
首先解释一下“内网”与“外网”的概念: 内网:即所说的局域网,比如学校的局域网,局域网内每台计算机的IP地址在本局域网内具有互异性,是不可重复的.但两个局域网内的内网IP可以有相同的. 外网:即互联网 ...
- Python-os模块-60
os 模块: 和操作系统打交道的模块 os模块是与操作系统交互的一个接口 os.makedirs('dirname1/dirname2') 可生成多层递归目录 os.removedirs('dirna ...
- Django的路由层
U RL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代 ...
- 用C# BigInteger实现的BigDecimal类,终于可以直接做四则运算了。
https://code.google.com/p/dotnet-big-decimal/ 这是个BigDecimal类的开源项目,支持Operators +, - and *. 俺给改了改,加上了除 ...
- Elasticsearch - 简单介绍
Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时 ...
- Spring AOP详细介绍
AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...
- react-router的坑
componentWillReceiveProps(nextProps){ 在改钩子函数里接受组件变化的最近的传递的props 如果在这里没有使用nextprops 而是调用this.props 会出 ...
- C\C++学习笔记 3
C++记录7 函数指针: 函数名为地址, 地址指的是在机器指令存储的地址. double func(int line){ reture line*3.5;} void f(int line, doub ...