什么是JSON?
- JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
- JSON 是轻量级的文本数据交换格式
- JSON 独立于语言:JSON 使用 Javascript语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和
JSON 库支持许多不同的编程语言。 目前非常多的动态(PHP,JSP,.NET)编程语言都支持JSON。 - JSON 具有自我描述性,更易理解
与xml的异同之处
- 相同之处
- JSON是纯文本
- JSON具有“自我描述性“(人类可读)
- JSON具有层级结构
- JSON可通过JavaScript进行解析
- JSON数据可使用AJAX进行传输
- 不同之处
- 没有结束标签
- 更短
- 读写速度更快
- 能够使用内建的JavaScript eval()方法进行解析
- 使用数组
- 不适用保留字
JSON语法
- JSON语法规则
- 数据在名称/值对中
- 数据由逗号分隔
- 数据由逗号分隔
- 大括号保存对象
- 中括号保存数组
- JSON名称/值对
JSON 数据的书写格式是:名称/值对。
名称/值对包括字段名称(在双引号中),后面写一个冒号,然后是值:
"name" : "阿狗"
JSON值
可以是:
- 数字(整数或浮点数)
- 字符串(在双引号中)
- 逻辑值(true或false)
- 数组(在中括号中)
- 对象(在大括号中)
- null
FastJSON的基本使用
- 序列化
序列化是指把JavaBean对象转化成json格式的字符串
com.alibaba.fastjson.JSON提供了许多方法(多态)实现序列化。
- 基本的序列化
import com.alibaba.fastjson.JSON;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class FastJSONTest {
public static void main(String[] args) {
//将map转成JSON对象
Map<String,Object> map1 = new HashMap<String, Object>();
map1.put("k1","one");
map1.put("k2","two");
String mapJson = JSON.toJSONString(map1);
System.out.println(mapJson);
//将list转成JSON对象
List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();
Map<String,Object> map2 = new HashMap<String, Object>();
map2.put("k1","Three");
map2.put("k2","Four");
list.add(map1);
list.add(map2);
String listJson = JSON.toJSONString(list);
System.out.println(listJson);
//自定义JavaBean转成JSON
Shengshi sshi =new Shengshi();
sshi.setName("山西");
ArrayList<String> cities = new ArrayList<String>();
cities.add("太原");
cities.add("大同");
sshi.setCities(cities);
String sshiJson = JSON.toJSONString(sshi);
System.out.println(sshiJson);
//输出格式化后的JSON字符串
//传入一个对象和一个布尔类型(是否格式化),将对象转成格式化后的JSON字符串。
String listJsonFormat = JSON.toJSONString(list,true);
System.out.println(listJsonFormat);
}
}
结果:
{"k1":"one","k2":"two"}
[{"k1":"one","k2":"two"},{"k1":"Three","k2":"Four"}]
{"cities":["太原","大同"],"name":"山西"}
[
{
"k1":"one",
"k2":"two"
},
{
"k1":"Three",
"k2":"Four"
}
]
- FastJson还提供许多特性支持
String objJson = JSON.toJSONString(Object object, SerializerFeature... features)
传入一个对象和SerializerFeature类型的可变变量。SerializerFeature是一个枚举。
com.alibaba.fastjson.serializer.SerializerFeature
//日期格式化
//FastJSON可以直接对日期类型格式化,在缺省的情况下,FastJSON会将Date转成long。
String dateJson1 = JSON.toJSONString(new Date());
System.out.println(dateJson1);
//使用SerializerFeature特性格式化日期。
String dateJson2 = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);
System.out.println(dateJson2);
//指定输出日期格式
String dateJson3 = JSON.toJSONStringWithDateFormat(new Date(),"yyyy-MM-dd HH:mm:ss");
System.out.println(dateJson3);
//使用单引号
String listJson2 = JSON.toJSONString(list,SerializerFeature.UseSingleQuotes);
System.out.println(listJson2);
//JSON格式化
String listJsonFormat1 = JSON.toJSONString(list,SerializerFeature.PrettyFormat);
System.out.println(listJsonFormat1);
//输出Null字段
//缺省情况下FastJSON不输入为值Null的字段,可以使用SerializerFeature.WriteMapNullValue使其输出。
Map<String,Object> map3 = new HashMap<String, Object>();
String b=null;
Integer i = 1;
map3.put("a",b);
map3.put("b",i);
String listJson4 = JSON.toJSONString(map3,SerializerFeature.WriteMapNullValue);
System.out.println(listJson4);
//序列化要写入类型信息。
Shengshi sshi1 =new Shengshi();
sshi1.setName("山西");
ArrayList<String> cities1 = new ArrayList<String>();
cities1.add("太原");
cities1.add("大同");
sshi1.setCities(cities1);
String sshiJson1 = JSON.toJSONString(sshi,SerializerFeature.WriteClassName,SerializerFeature.PrettyFormat);
System.out.println(sshiJson1);
//反序列化(由于序列化带了类型信息,使得反序列化时能够自动进行类型识别。)
Shengshi sshi2 = (Shengshi)JSON.parse(sshiJson1);
System.out.println(sshi2.toString());
结果:
1534257943343
"2018-08-14 22:45:43"
"2018-08-14 22:45:43"
[{'k1':'one','k2':'two'},{'k1':'Three','k2':'Four'}]
[
{
"k1":"one",
"k2":"two"
},
{
"k1":"Three",
"k2":"Four"
}
]
{"a":null,"b":1}
{
"@type":"Shengshi",
"cities":[
"太原",
"大同"
],
"name":"山西"
}
Shengshi{name='山西', cities=[太原, 大同]}
- 反序列化
//集合反序列化
List<Map> list1 = JSON.parseArray(listJson,Map.class);
for (Map<String,Object>map:list1)
{
System.out.println(map.get("k1"));
System.out.println(map.get("k2"));
}
//泛型的反序列化(使用TypeReference传入类型信息)。
Map<String,Object> map4 = JSON.parseObject(mapJson,new TypeReference<Map<String,Object>>(){});
System.out.println(map4.get("k1"));
System.out.println(map4.get("k2"));
结果:
one
two
Three
Four
one
two