参考: http://blog.csdn.net/wx_962464/article/details/37612861

maven库下载

fastjson基本样例1

Cat.java

package test;

class Cat {
private String color; public String getColor() {
return color;
} public void setColor(String color) {
this.color = color;
} @Override
public String toString() {
return "Cat [color=" + color + "]";
} };

Master.java

package test;

import java.util.ArrayList;
import java.util.List; //主人
class Master {
private String name;
private List<Cat> cats = new ArrayList<Cat>(); public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<Cat> getCats() {
return cats;
} public void setCats(List<Cat> cats) {
this.cats = cats;
} @Override
public String toString() {
return "Master [name=" + name + ", cats=" + cats + "]";
} }

FastjsonDemo.java

package test;

import java.util.List;

import com.alibaba.fastjson.JSON;

class FastjsonDemo {
public static void main(String[] args) {
Cat cat1 = new Cat();
cat1.setColor("white"); Cat cat2 = new Cat();
cat2.setColor("black"); Master master = new Master();
master.setName("bobo");
master.getCats().add(cat1);
master.getCats().add(cat2); // 主人对象转json串
String masterJson = JSON.toJSONString(master);
System.out.println("master json : " + masterJson);
// json串转主人对象
Master masterObj = JSON.parseObject(masterJson, Master.class);
System.out.println("master object:" + masterObj); // 构建用户对象数组
Cat[] cats = new Cat[2];
cats[0] = cat1;
cats[1] = cat2;
// 数组转JSON串
String jsonString2 = JSON.toJSONString(cats);
System.out.println("array String:" + jsonString2);
// JSON串转
List<Cat> users2 = JSON.parseArray(jsonString2, Cat.class);
System.out.println("array obj:" + users2); }
}

输出语句:

master json : {"cats":[{"color":"white"},{"color":"black"}],"name":"bobo"}
master object:Master [name=bobo, cats=[Cat [color=white], Cat [color=black]]]
array String:[{"color":"white"},{"color":"black"}]
array obj:[Cat [color=white], Cat [color=black]]

fastjson使用过程中特别声明

当你用以下语句得到jsonStr输出为空,即{}时. 要特别留意你的对象是否符合javaBean规范:

javaBean约定get,set方法的第4个字母一定要大写,不过google 的gson倒是不用(其实这反而不规范)

String jsonStr = JSON.toJSONString(master);

当初由于公司习惯字符串以c开头,时间以t开头,数值以n开头来定义属性,如cName,tCrtTm,nAge,导致我的eclipse自动生成的get,set方法变成如下(getcName不规范),找了半小时才发现这个问题.

错误属性cName:

package test;

//主人
class Master {
private String cName; public String getcName() {
return cName;
} public void setcName(String cName) {
this.cName = cName;
} }

正确属性name:

package test;

//主人
class Master {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} }

fastjson基本样例2

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; public class test {
public static void main(String[] args) {
Map packet = new HashMap();
Map requestHead = new HashMap();
Map requestBody = new HashMap();
Map base = new HashMap();
List coverageList = new ArrayList();
Map coverage1 = new HashMap();
Map coverage2 = new HashMap(); packet.put("requestHead",requestHead );
packet.put("requestBody",requestBody ); requestHead.put("userId", "userid1234");
requestHead.put("password", "password1234");
requestHead.put("serviceNo", "serviceNo1234"); requestBody.put("base", base); base.put("basekey1", "value1");
base.put("basekey2", "value2");
base.put("basekey3", "value3"); requestBody.put("coverage_list", coverageList); coverageList.add(coverage1);
coverageList.add(coverage2); coverage1.put("coverageCode1", "value1");
coverage1.put("coverageName1", "value1");
coverage2.put("coverageCode2", "value2");
coverage2.put("coverageName2", "value2"); String jsonStr = JSON.toJSONString(packet,true); System.out.println("把map转换成json String后打印如下:");
System.out.println(jsonStr); JSONObject jsonObj = JSON.parseObject(jsonStr); JSONObject requestHeadObj = jsonObj.getJSONObject("requestBody").getJSONObject("base");
Set<Entry<String, Object>> set = requestHeadObj.entrySet();
System.out.println("jsonObj中requestBody>base节点下的各值如下:");
for(Entry<String,Object> entry :set){
System.out.println(entry.getKey()+":"+entry.getValue());
} }
}

不规则字段的映射

如果反/序列化时想做不种类型的映射,可以在get , set方法上加JSONField 不同name的特殊自理, 而不是在属性做做统一处理, 可参考 fastjson使用-- @JSONField使用【转】==>https://www.cnblogs.com/whatlonelytear/p/12302205.html

由于json中的key与bean中的属性不能匹配,因此在转换过程中出现了部分属性为null的情况。经过查看官方文档,发现可以使用@JSONField进行解释,但是并没有详细的使用说明。

@JSONField的作用对象:

1. Field
2. Setter 和 Getter方法

注:FastJson在进行操作时,是根据getter和setter的方法进行的,并不是依据Field进行。

Show me the code:

一、作用Field

@JSONField作用在Field时,其name不仅定义了输入key的名称,同时也定义了输出的名称

参考自: FastJson中@JSONField注解使用==>https://www.cnblogs.com/softidea/p/5681928.html

fastjson格式化输出

JSON.toJSONString(
retObject,
SerializerFeature.PrettyFormat,
SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteDateUseDateFormat);
JSON.toJSONString(retObject,true)

//在main方法中指定全局日期格式

    public void fastjsonInit() {
//时间格式化
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";//原始默认就是该配置
//是否输出值为null的字段,默认为false
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask();
//数值字段如果为null,输出为0,而非null
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullNumberAsZero.getMask();
//List字段如果为null,输出为[],而非null
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullListAsEmpty.getMask();
//字符类型字段如果为null,输出为 "",而非null
//JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteNullStringAsEmpty.getMask(); }

因为源码中就是public的属性,所以直接改变即可

public abstract class JSON implements JSONStreamAware, JSONAware {
public static TimeZone defaultTimeZone = TimeZone.getDefault();
public static Locale defaultLocale = Locale.getDefault();
public static String DEFAULT_TYPE_KEY = "@type";
static final SerializeFilter[] emptyFilters = new SerializeFilter[0];
public static String DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static int DEFAULT_PARSER_FEATURE;
public static int DEFAULT_GENERATE_FEATURE; }

常用FastJSON的SerializerFeature特性及日期转换格式==>https://www.cnblogs.com/xd03122049/p/6079695.html

  • SerializerFeature.PrettyFormat:格式化输出
  • SerializerFeature.WriteMapNullValue:是否输出值为null的字段,默认为false
  • SerializerFeature.DisableCircularReferenceDetect:消除循环引用
  • SerializerFeature.WriteNullStringAsEmpty:将为null的字段值显示为""
  • WriteNullListAsEmpty:List字段如果为null,输出为[],而非null
  • WriteNullNumberAsZero:数值字段如果为null,输出为0,而非null
  • WriteNullBooleanAsFalse:Boolean字段如果为null,输出为false,而非null
  • SkipTransientField:如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
  • SortField:按字段名称排序后输出。默认为false
  • WriteDateUseDateFormat:全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
  • BeanToArray:将对象转为array输出
  • QuoteFieldNames:输出key时是否使用双引号,默认为true
  • UseSingleQuotes:输出key时使用单引号而不是双引号,默认为false(经测试,这里的key是指所有的输出结果,而非key/value的key,而是key,和value都使用单引号或双引号输出)

fastjson设置指定日期属性的格式化==>https://blog.csdn.net/john1337/article/details/76277617

如果要被序列化的对象含有一个date属性或者多个date属性按照相同的格式序列化日期的话,那我们可以使用下面的语句实现:

1.JSONObject.DEFFAULT_DATE_FORMAT="yyyy-MM-dd";//设置日期格式
2.JSONObject.toJSONString(resultMap, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteDateUseDateFormat);

但是上面的解决方案面临一个问题,如果不满足上面的条件(多个date属性,而且需要按照不定的格式序列化这些日期属性),那么我们就需要另辟蹊径,使用fastjson的特性来完成:

@JSONField(format="yyyyMMdd")
private Date date;
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date1;

fastjson格式化后排序问题

//1、解析时增加不调整顺序参数
JSONObject jsonObj= JSONObject.parseObject(jsonStr, Feature.OrderedField); //2、初始化json对象为有序对象:这样前后数据就可以保持时一致。
JSONObject retObj = new JSONObject(true);

gson

3、使用Gson解析
JsonObject returnData = new JsonParser().parse(replyString).getAsJsonObject();

常用json格式化工具类

public class JsonTool {

    public static final String prettyJson(String jsonString){
String result = JSON.toJSONString(JSONObject.parse(jsonString), true);
return result;
} public static final String prettyJson(Object obj){
String result = JSON.toJSONString(obj, true);
return result;
}
}

gson

Gson入门教程【原】

我的其它相关文章

fastjson基本使用 (待继续完善)【原】

fastjson json和map及对象转换【转】【补】

使用FastJSON 对Map/JSON/String 进行互相转换==>https://blog.csdn.net/liu59412/article/details/87935888

其它文章

fastjson转换json时,碰到的那些首字母大小写转换的坑!==》https://segmentfault.com/a/1190000015634321

fastjson基本使用 (待继续完善)【原】的更多相关文章

  1. fastjson基本使用 (待大量完善)

    参考: http://blog.csdn.net/wx_962464/article/details/37612861 maven库下载 fastjson基本使用 import java.util.A ...

  2. Gson入门教程【原】

    gson一个jar包就能纵横天下,不像Json-lib.jar依赖其它jar包. 点击右边图片下载jar包       或以下链接 http://central.maven.org/maven2/co ...

  3. fastjson到底做错了什么?为什么会被频繁爆出漏洞?

    GitHub 15.8k Star 的Java工程师成神之路,不来了解一下吗! GitHub 15.8k Star 的Java工程师成神之路,真的不来了解一下吗! GitHub 15.8k Star ...

  4. 奥威Power-BI V11——凤凰涅槃,重磅来袭

    时隔一年,奥威Power-BI重磅再推新版,在之前V10 WEB可视化前端分析工具基础上,更加注重用户体验这一块.V11站在用户的角度,以用户的视野去设计研发新版本,最终在前端框架的优化.移动设备的体 ...

  5. uCGUI 按键窗口切换机制(更新篇)

    在之前文章中,讲述了一个低内存使用量的的窗口切换机制.有人会问,低内存使用量是多低呢,我这里举个例子.我有一个项目中使用到本切换机制,128*64的单色屏,初步计算有105个窗口(后面还会增加),总内 ...

  6. Fastjson是一个Java语言编写的高性能功能完善的JSON库。

    简介 Fastjson是一个Java语言编写的高性能功能完善的JSON库. 高性能 fastjson采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson. ...

  7. [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化

    KVM 虚拟化原理探究(5)- 网络IO虚拟化 标签(空格分隔): KVM IO 虚拟化简介 前面的文章介绍了KVM的启动过程,CPU虚拟化,内存虚拟化原理.作为一个完整的风诺依曼计算机系统,必然有输 ...

  8. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  9. php 基础代码大全(不断完善中)

    下面是基础的PHP的代码,不断完善中~ //语法错误(syntax error)在语法分析阶段,源代码并未被执行,故不会有任何输出. /* [命名规则] */ 常量名 类常量建议全大写,单词间用下划线 ...

随机推荐

  1. 腾讯 xtestserver 基本使用教程~

    刚刚简单录制了下 腾讯demo的基本测试脚本 成功~get新技能成功~开心ing~ 体验就是: 1.各种安卓机找开发者中心选项的usb调试模式太难找了.. 2.不管录制还是播放录制时都感觉好慢... ...

  2. PAT 1022 D进制的A+B

    https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344 输入两个非负10进制整数A和B(<=2 ...

  3. Spring Cloud的Zuul的使用问题

    Zuul Client 放在移动App中,Zuul Server可以做集群. Zuul Client放在jar包吗?ios怎么办? Zuul与Spring Security配合使用,与Shiro做集成 ...

  4. Navicat连接mysql备份数据库提示:1577 – Cannot proceed because system tables used by Event Scheduler where found damaged at server start

    解决办法,可以参考试试: http://www.cnblogs.com/huangcong/p/3389010.html http://blog.csdn.net/phpfenghuo/article ...

  5. Using Android Phone to recover SD card formatted with DD command under linux

    Using Android Phone to recover SD card formatted with DD command under linux 1. Formatted a sd card ...

  6. [转帖]老狼:你知道哪些关于 Windows 10 的骚操作?

    作者:老狼链接:https://www.zhihu.com/question/265781599/answer/579939418来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...

  7. 微信小程序入門學習資料鏈接

    https://blog.csdn.net/github_38847071/article/details/73250258 https://blog.csdn.net/lily2016n/artic ...

  8. jenkins--svn+添加钩子去触发jenkins的job工作

    找到svn钩子脚本 post-commit: 添加一个接口: /usr/bin/curl http://admin:admin@x.x.x.x:8080/job/svn/buildWithParame ...

  9. ASP.NET MVC5使用Area区域

    转载:http://www.lanhusoft.com/Article/217.html 在大型的ASP.NET mvc5项目中一般都有许多个功能模块,这些功能模块可以用Area(中文翻译为区域)把它 ...

  10. 【Luogu4630】【APIO2018】 Duathlon 铁人两项 (圆方树)

    Description ​ 给你一张\(~n~\)个点\(~m~\)条边的无向图,求有多少个三元组\(~(x, ~y, ~z)~\)满足存在一条从\(~x~\)到\(~z~\)并且经过\(~y~\)的 ...