JSON转换大合集

JSONObject转String

引包:

       import java.text.SimpleDateFormat;
       import com.alibaba.fastjson.JSONObject;
       import com.alibaba.fastjson.serializer.SerializerFeature;
       import java.util.Date;

1.排序

JSONObject:当使用的是JSONObject无参的构造器new出的对象,此时依靠HashMap来存储,输出的结果是按照key类型变量的升序来排序;JSONObject提供了可选排序参数,若传入true,则是以LinkedHashMap存储,则输出结果是按照put的顺序输出。

/**com.alibaba.fastjson.JSONObject —— 无序 */
String strDateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "张三");
jsonObject.put("dateformat",sdf.format(new Date()));
jsonObject.put("date",new Date());
jsonObject.put("sex", "男");
jsonObject.put("age", 25);
jsonObject.put("phone",null);
System.out.println("默认序列化无序打印:" +JSONObject.toJSONString(jsonObject));
/**输出结果:默认序列化无序打印:{"date":1648350382278,"sex":"男","name":"张三","dateformat":"2022-03-27 11:06:22","age":25}*/

/**com.alibaba.fastjson.JSONObject —— 有序 */
JSONObject jsonObjectOrdered = new JSONObject(true);
jsonObjectOrdered.put("name", "张三");
jsonObjectOrdered.put("date",sdf.format(new Date()));
jsonObjectOrdered.put("sex", "男");
jsonObjectOrdered.put("age", 25);
jsonObjectOrdered.put("phone",null);
System.out.println("默认序列化有序打印:" +JSONObject.toJSONString(jsonObjectOrdered));
/**输出结果:默认序列化有序打印:{"name":"张三","date":"2022-03-27 11:06:22","sex":"男","age":25}*/

2.序列化

序列化在不指定时,尤为需要注意的是,null数据的属性不会打印。
一些可选的序列化方式,展示如下(表格来源:勤学如春起之苗)

名称含义
QuoteFieldNames输出key时是否使用双引号,默认为true
UseSingleQuotes使用单引号而不是双引号,默认为false
WriteMapNullValue是否输出值为null的字段,默认为false
WriteEnumUsingToStringEnum输出name()或者original,默认为false
UseISO8601DateFormatDate使用ISO8601格式输出,默认为false
WriteNullListAsEmptyList字段如果为null,输出为[],而非null
WriteNullStringAsEmpty字符类型字段如果为null,输出为”“,而非null
WriteNullNumberAsZero数值字段如果为null,输出为0,而非null
WriteNullBooleanAsFalseBoolean字段如果为null,输出为false,而非null
SkipTransientField如果是true,类中的Get方法对应的Field是transient,序列化时将会被忽略。默认为true
SortField按字段名称排序后输出。默认为false
WriteTabAsSpecial把\t做转义输出,默认为false
PrettyFormat结果是否格式化,默认为false
WriteClassName序列化时写入类型信息,默认为false。反序列化是需用到
DisableCircularReferenceDetect消除对同一对象循环引用的问题,默认为false
WriteSlashAsSpecial对斜杠’/’进行转义
BrowserCompatible将中文都会序列化为\uXXXX格式,字节数会多一些,但是能兼容IE 6,默认为false
WriteDateUseDateFormat全局修改日期格式,默认为false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
DisableCheckSpecialChar一个对象的字符串属性中如果有特殊字符如双引号,将会在转成json时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为false
NotWriteRootClassName
BeanToArray将对象转为array输出
WriteNonStringKeyAsString不是String的字段写为String
NotWriteDefaultValue不设默认值
BrowserSecure
IgnoreNonFieldGetter忽略没有getter方法的属性
WriteEnumUsingName目前版本的fastjson默认对enum对象使用WriteEnumUsingName属性,因此会将enum值序列化为其Name。使用WriteEnumUsingToString方法可以序列化时将Enum转换为toString()的返回值;同时override toString函数能够将enum值输出需要的形式。但是这样做会带来一个问题,对应的反序列化使用的Enum的静态方法valueof可能无法识别自行生成的toString(),导致反序列化出错。如果将节省enum序列化后的大小,可以将enum序列化其ordinal值,保存为int类型。fastJson在反序列化时,如果值为int,则能够使用ordinal值匹配,找到合适的对象。fastjson要将enum序列化为ordinal只需要禁止WriteEnumUsingName feature。首先根据默认的features排除WriteEnumUsingName,然后使用新的features序列化即可。

以输出null数据为例:

/**com.alibaba.fastjson.JSONObject —— null数据无序 */
String strDateFormat = "yyyy-MM-dd HH:mm:ss";
SimpleDateFormat sdf = new SimpleDateFormat(strDateFormat);
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "张三");
jsonObject.put("dateformat",sdf.format(new Date()));
jsonObject.put("date",new Date());
jsonObject.put("sex", "男");
jsonObject.put("age", 25);
jsonObject.put("phone",null);
System.out.println("默认序列化无序打印:" +JSONObject.toJSONString(jsonObject));
/**输出结果:默认序列化无序打印:{"date":1648350382278,"sex":"男","name":"张三","dateformat":"2022-03-27 11:06:22","age":25}*/
System.out.println("null数据无序打印:" +JSONObject.toJSONString(jsonObject, SerializerFeature.WriteMapNullValue));
/**输出结果:null数据无序打印:{"date":1648350382278,"phone":null,"sex":"男","name":"张三","dateformat":"2022-03-27 11:06:22","age":25}*/

String转JSONObject

引包:

       import com.alibaba.fastjson.JSONObject;
       import com.alibaba.fastjson.JSONArray;
String jsonStr = "{\"name\":\"张三\",\"age\":20}";
JSONObject jsonObject =JSONObject.parseObject(jsonStr);
System.out.println(jsonObject);
/**输出结果:{"name":"张三","age":20}*/
System.out.println(jsonObject.get("age"));
/**输出结果:20*/JSONObject中包含数组,可如此获取:
String jsonContainArrStr = "{\"name\":\"张三\",\"age\":20,\"subject\":[\"语文\",\"数学\"]}";
JSONObject jsonContainArr =JSONObject.parseObject(jsonContainArrStr);
JSONArray subjectArray= jsonContainArr.getJSONArray("subject");
System.out.println(subjectArray);
/**输出结果:["语文","数学"]*/

String转JSONArray

引包:

       import com.alibaba.fastjson.JSONObject;
       import com.alibaba.fastjson.JSONArray;
String jsonArrStr = "[{\"name\":\"张三\",\"age\":20},{\"name\":\"李四\",\"age\":25}]";
JSONArray jsonArray= JSONArray.parseArray(jsonArrStr);
System.out.println(jsonArray);
/**输出结果:[{"name":"张三","age":20},{"name":"李四","age":25}]*/
// 方法一
for (Object obj : jsonArray) {
    JSONObject jsonObject = (JSONObject)obj;
    System.out.println(jsonObject.get("name"));
}
/**输出结果:张三 \n 李四*/

// 方法二
for (int i = 0; i < jsonArray.size(); i++) {
    JSONObject jsonObj = jsonArray.getJSONObject(i);
    System.out.println(jsonObj.get("name"));
}
/**输出结果:张三 \n 李四*/

Map转为JSON格式的字符串

引包:

       import com.alibaba.fastjson.JSONObject;
       import com.alibaba.fastjson.serializer.SerializerFeature;
       import java.util.Date;
       import java.util.HashMap;
       import java.util.LinkedHashMap;
       import java.util.Map;

不在乎顺序,可以使用HashMap,若希望按照put的顺序生成字符串,使用LinkedHashMap。
序列化参数可作为显示结果的可控变量(以null属性显示与否为例)

Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("name","张三");
paramMap.put("age",20);
paramMap.put("birthday",new Date());
paramMap.put("phone",null);
String mapStr = JSONObject.toJSONString(paramMap);
System.out.println("不显示null属性" + mapStr);
/** 输出结果:不显示null属性{"birthday":1648380885870,"name":"张三","age":20}*/
String mapShowNullStr = JSONObject.toJSONString(paramMap,SerializerFeature.WriteMapNullValue);
System.out.println("显示null属性" + mapShowNullStr);
/** 输出结果:显示null属性{"birthday":1648380885870,"phone":null,"name":"张三","age":20}*/

Map<String, Object> linkedMap = new LinkedHashMap<>();
linkedMap.put("name","张三");
linkedMap.put("age",20);
linkedMap.put("birthday",new Date());
linkedMap.put("phone",null);
String linkedMapStr = JSONObject.toJSONString(linkedMap);
System.out.println("不显示null属性-put顺序展示" + linkedMapStr);
/** 输出结果:不显示null属性-put顺序展示{"name":"张三","age":20,"birthday":1648380885931}*/
String linkedMapShowNullStr = JSONObject.toJSONString(linkedMap, SerializerFeature.WriteMapNullValue);
System.out.println("不显示null属性-put顺序展示" + linkedMapShowNullStr);
/** 输出结果:不显示null属性-put顺序展示{"name":"张三","age":20,"birthday":1648380885931,"phone":null}*/

实体类转JSON格式的字符串

引包:

       import com.alibaba.fastjson.JSONObject;
       import com.alibaba.fastjson.serializer.SerializerFeature;
       import java.util.Date;

1.排序

对象:默认是按照fieldName 的字母序进行序列化的,可以使用@JSONField(ordinal = XX)来指定输出顺序(这个特性需要 1.1.42 以上版本)

/**com.alibaba.fastjson.JSONObject —— 对象无序 */
Person person = new Person();
person.setName("李四");
person.setSex("男");
person.setAge(20);
person.setBirthday(new Date());
person.setDateNoFormat(new Date());
person.setPhone(null);
System.out.println("对象无序打印:" +JSONObject.toJSONString(person));
/**输出结果:对象无序打印:{"age":20,"birthday":"2022-03-27","dateNoFormat":1648350382318,"name":"李四","sex":"男"}*/

/**com.alibaba.fastjson.JSONObject —— 对象有序 */
PersonOrder personOrder = new PersonOrder();
personOrder.setName("王五");
personOrder.setSex("女");
personOrder.setAge(18);
personOrder.setBirthday(new Date());
personOrder.setDateNoFormat(new Date());
personOrder.setPhone(null);
System.out.println("对象有序打印:" +JSONObject.toJSONString(personOrder));
/**输出结果:对象有序打印:{"name":"王五","sex":"女","age":18,"birthday":"2022-03-27","dateNoFormat":1648350382346}*/

2.序列化

对象可以使用@JSONField(format=“yyyy-MM-dd”)完成日期的格式化。以输出null数据为例:

/**com.alibaba.fastjson.JSONObject —— 对象null数据无序 */
Person person = new Person();
System.out.println(person.toString());
person.setName("李四");
person.setSex("男");
person.setAge(20);
person.setBirthday(new Date());
person.setDateNoFormat(new Date());
person.setPhone(null);
System.out.println("对象无序打印:" +JSONObject.toJSONString(person));
/**输出结果:对象无序打印:{"age":20,"birthday":"2022-03-27","dateNoFormat":1648350382318,"name":"李四","sex":"男"}*/
System.out.println("对象null数据无序打印:" +JSONObject.toJSONString(person, SerializerFeature.WriteMapNullValue));
/**输出结果:对象null数据无序打印:{"age":20,"birthday":"2022-03-27","dateNoFormat":1648350382318,"name":"李四","phone":null,"sex":"男"}*/

List转String

引包:

       import com.alibaba.fastjson.JSONObject;
       import com.alibaba.fastjson.serializer.SerializerFeature;
       import org.apache.tomcat.util.buf.StringUtils;
       import java.util.ArrayList;
       import java.util.Date;
       import java.util.List;

1.List<实体类>转String

默认不包含null属性,可用序列化参数控制显示(以输出null数据为例)

List<Person> personList = new ArrayList<>();
Person person1 = new Person("张三",20,"男",new Date(),new Date(),null);
Person person2 = new Person("李四",18,"女",new Date(),new Date(),"13122334455");
personList.add(person1);
personList.add(person2);
String jsonStr = JSONObject.toJSONString(personList);
String jsonShowNullStr = JSONObject.toJSONString(personList, SerializerFeature.WriteMapNullValue);
System.out.println("不含null数据" + jsonStr);
/** 输出结果:[{"age":20,"birthday":"2022-03-27","dateNoFormat":1648388388086,"name":"张三","sex":"男"},{"age":18,"birthday":"2022-03-27","dateNoFormat":1648388388086,"name":"李四","phone":"13122334455","sex":"女"}]*/
System.out.println(jsonShowNullStr);
/** 输出结果:[{"age":20,"birthday":"2022-03-27","dateNoFormat":1648388388086,"name":"张三","phone":null,"sex":"男"},{"age":18,"birthday":"2022-03-27","dateNoFormat":1648388388086,"name":"李四","phone":"13122334455","sex":"女"}]*/

2.List转String

null数据也会被打印出来,不需要json结构的,使用join函数,可以按指定字符分割得到字符串。

List<String> subjects = new ArrayList<>();
subjects.add("语文");
subjects.add("数学");
subjects.add("英语");
subjects.add(null);
String subjectStr = JSONObject.toJSONString(subjects);
String test = StringUtils.join(subjects,',');
System.out.println("带方括号和引号的数据:"+ subjectStr);
/**输出结果:带方括号和引号的数据:["语文","数学","英语",null]*/
System.out.println("按逗号分割的数据" + test);
/**输出结果:按逗号分割的数据语文,数学,英语,null*/

JSONArray转List<实体类>

引包:

       import com.alibaba.fastjson.JSONArray;
       import java.util.List;
String jsonArrStr = "[{\"name\":\"张三\",\"age\":20},{\"name\":\"李四\",\"age\":25}]";
JSONArray jsonArray= JSONArray.parseArray(jsonArrStr);
List<Person> people = jsonArray.toJavaList(Person.class);
for(Person person: people){
    System.out.println(person.getName()+";"+person.getAge());
}
/**输出结果:张三;20 \n 李四;25*/
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值