1.JSON基礎
1.1 JSON概述
JSON或JavaScript Object Notation是一種基於文本的輕量級開放標准,專為人類可讀的數據交換而設計。 程序員已經知道JSON使用的約定,包括C,C ++,Java,Python,Perl等。
-
JSON代表JavaScript Object Notation。
-
格式由Douglas Crockford指定。
-
它專為人類可讀的數據交換而設計。
-
它已經從JavaScript腳本語言擴展而來。
-
文件擴展名為.json 。
-
JSON Internet Media類型是application/json 。
-
統一類型標識符是public.json。
JSON的使用場景:
-
在編寫包含瀏覽器擴展和網站的基於JavaScript的應用程序時使用它。
-
JSON格式用於通過網絡連接序列化和傳輸結構化數據。
-
它主要用於在服務器和Web應用程序之間傳輸數據。
-
Web服務和API使用JSON格式來提供公共數據。
-
它可以與現代編程語言一起使用。
1.2 JSON語法
JSON語法基本上被認為是JavaScript語法的子集; 它包括以下內容 -
-
數據以名稱/值對表示。
-
大括號保持對象,每個名稱后跟':'(冒號),名稱/值對用(逗號)分隔。
-
方括號包含數組,值以(逗號)分隔。
使用案例:
{ "book": [ { "id": "01", "language": "Java", "edition": "third", "author": "Herbert Schildt" }, { "id": "07", "language": "C++", "edition": "second", "author": "E.Balagurusamy" } ] }
2.FastJson
fastjson是目前java語言中最快的json庫,比自稱最快的jackson速度要快,第三方獨立測試結果說明比gson快大約6倍,fastjson采用獨創的算法,將parse的速度提升到極致,超過所有json庫。 FastJson速度最快,fastjson具有極快的性能,超越任其他的Java Json parser。
maven依賴:
mvnrepository地址:https://mvnrepository.com/artifact/com.alibaba/fastjson/1.2.75
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
2.1 序列化
2.1.1 將Map轉成JSON
使用案例:
public class FastJsonTest { public static void main(String[] args) { Map<String, Object> map = new HashMap<>(); map.put("key1", "One"); map.put("key2", "Two"); String mapJson = JSON.toJSONString(map); System.out.println(mapJson); } }
控制台輸出:
{"key1":"One","key2":"Two"}
2.1.2 將List<Map>轉成JSON
使用案例:
/** * @Author lucky * @Date 2021/12/31 14:40 */ public class FastJsonTest { public static void main(String[] args) { List<Map<String, Object>> list = new ArrayList<>(); Map<String, Object> map1 = new HashMap<>(); map1.put("key1", "One"); map1.put("key2", "Two"); Map<String, Object> map2 = new HashMap<>(); map2.put("key3", "Three"); map2.put("key4", "Four"); list.add(map1); list.add(map2); String listJson = JSON.toJSONString(list); String formatJson = JSON.toJSONString(list, true); System.out.println(listJson); System.out.println(formatJson); } }
控制台輸出:
[{"key1":"One","key2":"Two"},{"key3":"Three","key4":"Four"}] [ { "key1":"One", "key2":"Two" }, { "key3":"Three", "key4":"Four" } ]
可以輸出格式化后的 JSON 字符串:
String objJson = JSON.toJSONString(Object object, boolean prettyFormat);
2.1.3 自定義JavaBean User轉成JSON
使用案例:
User實體類:
/** * @Author lucky * @Date 2021/12/31 15:02 */ @Data public class User { private String name; private int age; }
測試代碼:
public class FastJsonTest { public static void main(String[] args) { User user=new User(); user.setName("lucky"); user.setAge(25); String s = JSON.toJSONString(user); System.out.println(s); } }
控制台輸出:
{"age":25,"name":"lucky"}
2.1.4 指定輸出日期格式
使用案例:
public class FastJsonTest { public static void main(String[] args) { String dateJson = JSON.toJSONStringWithDateFormat(new Date(), "yyyy-MM-dd HH:mm:ss.SSS"); System.out.println(dateJson); } }
控制台輸出:
"2021-12-31 15:26:55.100"
2.2 反序列化
反序列化就是把JSON格式的字符串轉化為Java Bean對象。
2.2.1 將2.1.3案例反序列化
使用案例:
public class FastJsonTest { public static void main(String[] args) { String userJson="{"age":25,"name":"lucky"}";
User user1 = JSON.parseObject(userJson, User.class);
System.out.println(user1.getName());
}
}
控制台輸出:
lucky
2.2.2 集合反序列化
public class FastJsonTest { public static void main(String[] args) { String listJson="[{\"key1\":\"One\",\"key2\":\"Two\"},{\"key1\":\"Three\",\"key2\":\"Four\"}]"; List<Map> maps = JSON.parseArray(listJson, Map.class); for(Map<String, Object> map : maps){ System.out.println(map.get("key1")); System.out.println(map.get("key2")); } } }
控制台輸出:
One
Two
Three
Four
3.JSONObject
3.1 構建JSON字符串(toJSONString)
3.1.1 JSONObject 轉 JSON 字符串
直接構建即直接實例化一個JSONObject對象,而后調用其put()方法,將數據寫入。put()方法的第一個參數為key值,必須為String類型,第二個參數為value,可以為boolean、double、int、long、Object、Map以及Collection等。當然,double以及int等類型只是在Java中,寫入到json中時,統一都會以Number類型存儲。
public class FastJsonTest { public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); jsonObject.put("name", "wjw"); jsonObject.put("age", 22); jsonObject.put("sex", "男"); jsonObject.put("school", "計量"); String jsonStr = JSONObject.toJSONString(jsonObject); System.out.println(jsonStr); } }
控制台輸出:
{"school":"計量","sex":"男","name":"wjw","age":22}
3.1.2 自定義JavaBean User轉成JSON字符串
相較於前一種方法,實際開發中應用JavaBean構建json的情況更為常見,因為這樣代碼的重用率更高。
public static void obj2String(){
User user=new User(); user.setName("lucky"); user.setAge(25); String s = JSONObject.toJSONString(user); System.out.println(s); }
控制台輸出:
{"age":25,"name":"lucky"}
3.2 解析json(parseObject)
3.2.1 JSON 字符串 轉 JSONObject 對象
public class FastJsonTest { public static void main(String[] args) { String jsonStr1 = "{\"school\":\"計量\",\"sex\":\"男\",\"name\":\"lucky\",\"age\":22}"; JSONObject jsonObject2 = JSONObject.parseObject(jsonStr1); System.out.println(jsonObject2.getString("name")); System.out.println(jsonObject2.getInteger("age")); } }
控制台輸出:
lucky
22
3.2.2 JSON 字符串 轉 指定的Map對象
通過使用JSONObject.parseObject(json, 類名.class)進行json數據的解析
方法說明:
public static <T> T parseObject(String text, Class<T> clazz)
測試案例:
public static void main(String[] args) { Param param=new Param(); param.setSubsysCode("STPM"); param.setContentId("10000001"); String paramStr = JSONObject.toJSONString(param); Object object = JSONObject.parseObject(paramStr, Map.class); System.out.println(object); }
3.2.3 JSON字符串轉JAVA簡單對象
//json字符串轉java簡單對象 public static void jsonStrToJavaBean() { String s ="{\"action\":\"add\",\"id\":\"1\",\"ordinal\":8,\"organUnitFullName\":\"testJSON\",\"parent\":\"0\",\"suborderNo\":\"58961\"}"; Data data = JSON.parseObject(s, Data.class); System.out.println("data對象"+data.toString()); System.out.println("action="+data.getAction()+"---id="+data.getId()); //data對象Data{id='1', suborderNo='58961', organUnitType='null', action='add', parent='0', organUnitFullName='testJSON', ordinal=8} //action=add---id=1 }
參考文獻:
https://blog.csdn.net/flysun3344/article/details/54707965
https://www.cnblogs.com/wjw1014/p/11677499.html