JSON:JavaScript 对象表示法(JavaScript Object Notation)。
json支持的数据类型:
- Number 数字型(整数或浮点数)
- String 字符串型(在双引号中)
- Boolean 布尔型(true 或 false)
- Object 对象(在花括号中,元素之间以逗号分隔) {“name”:”adf”,”age”:”123”}
- Array 数组 (在方括号中,元素之间以逗号分隔) [“1”,”2”,”3”]
- null 空值
ps:Object表示对象,类似于C语言中的结构体,以花括号”{}”括起来,其元素要求为键值对,key必须为String类型的,而value则可为任意类型。key和value之间以” : “表示映射关系。
市面上最常见的三种解析json的方式
<!-- 普通 json jar包 -->
<!-- https://mvnrepository.com/artifact/org.json/json -->
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20160810</version>
</dependency>
<!-- 阿里 fastjson jar包 -->
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<!-- 谷歌 gjson jar包 -->
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
关于 org.json
// -------JSONObject 初始化 -------
//方式一:
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.put("sex", "16");
//方式二:
Student stu = new Student();
stu.setAge("123");
stu.setName("adf");
JSONObject json = new JSONObject(stu);
//方式三:
Map<String,String> map = new HashMap<String ,String>();
map.put("a","1");
map.put("b","2");
JSONObject jsonMap = new JSONObject(map);
System.out.println(jsonMap);
//方式四:
String str = "{'name':'adf','age':'123'}";
JSONObject jsonStr = new JSONObject(str);
System.out.println(jsonStr);
//------- 一些简单常用的方法 -------
//put 和 accumulate
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.accumulate("sex","11");
System.out.println(obj);
obj.accumulate("sex","22");
obj.put("name", "Aili");
System.out.println(obj);
//输出结果
//{"sex":"11","name":"John"}
//{"sex":["11","22"],"name":"Aili"}
//put会取代旧值,accumulate会在旧值的基础上将value追加成数组
//append
//在值为数组的基础上追加,value类型不是数组会报错
obj.append("sex","33");
//optString 和 getString
//当key不存在时,optString会返回一个空字符串或者返回你指定的默认值,getString会报JSONException异常:org.json.JSONException: JSONObject["xxx"] not found.
JSONObject json = new JSONObject();
String str=json.optString (key); //key不存在会返回null。
String str=json.optString (key,fallback); //key不存在会返回指定默认值fallback。
//看到方法的返回值想必就理解怎么使用了吧,getString这个方法获取key对应的value值时必须保证value是String类型的否则报错
Object age = json.get("age");
String age1 = json.getString("age");
String age2 = json.optString("age");
Object age3 = json.opt("age");
//toJSONArray
//如果你想将JSONObject所有或者指定value转换成JSONArray,这个方法再合适不过了
//新建JSONArray,JSONArray里的值对应JSONObject的key即可,对应不上的会添加null
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.accumulate("sex","11");
System.out.println(obj);
JSONArray arr = new JSONArray();
arr.put("name");
arr.put("sex");
JSONArray objects = obj.toJSONArray(arr);
System.out.println(objects);
//getJSONArray 和 getJSONObject
//使用的前提对应value的类型要对应上
//如果只是简单的获取值建议用上边提到的get和opt系列即可,获取值后要进一步对JSONArray和JSONObject操作才建议使用这两个方法,毕竟达到的效果是一样的
JSONArray jsonArray = obj.getJSONArray("hobbies");
JSONObject jsonObject = obj.getJSONObject("stu");
关于 fastjson
//------- 初始化 -------
//方式一:
JSONObject obj = new JSONObject();
obj.put("name", "John");
obj.put("sex", "John");
System.out.println(obj);
//方式二:默认为false内部维护HashMap,当为true时维护LinkedHashMap,输出时按put顺序输出
JSONObject objOrder = new JSONObject(true);
objOrder.put("name", "John");
objOrder.put("sex", "16");
System.out.println(objOrder);
//方式三:因为内部维护的是Map,所以初始化不能直接使用对象
Map<String,Object> map = new HashMap<String ,Object>();
map.put("a","1");
map.put("b","2");
JSONObject jsonMap = new JSONObject(map);
System.out.println(jsonMap);
//方式四:
String str = "{'username':'John','password':'123'}";
JSONObject json = JSONObject.parseObject(str);
System.out.println(json);
//------- 一些简单常用的方法 -------
//因为内部维护的是Map所以一些方法的使用和操作Map会比较像
//get
//key存在则返回对应值,不存在返回空
JSONObject obj = new JSONObject();
obj.put("name", "John");
Object name = obj.get("name");
Object age = obj.get("age");
System.out.println(name);
System.out.println(age);
//getJSONArray 和 getJSONObject
//和之前提到的一样,value类型不对会报语法错:syntax error
JSONArray jsonArray = obj.getJSONArray("name");
JSONObject jsonObject = obj.getJSONObject("name");
//get:允许key不是String类型,查不到返回null
//getString:key必须为String类型,查不到返回null
//getObject:第二个参数可选,意思为将查出来的value进行类型转换,查不到返回null
Object sex = obj.get(12);
String string = obj.getString("name");
Double sex1 = obj.getObject("sex", Double.class);
//put:一次加一个,存在则返回旧值,取代旧值添加,不存在就返回null,添加
//putIfAbsent:存在则返回旧值,不添加,不存在就返回null,添加
//putAll:一次允许加多个
JSONObject obj = new JSONObject();
obj.put("name","Json");
Object o1 = obj.putIfAbsent("name", "Tom");
Map<String,Object > map = new HashMap<String,Object>();
map.put("1","1");
map.put("2","2");
obj.putAll(map);
//fluentPut 和 fluentPutAll
//从源码中看和上边提到的 put 和 putAll 没什么区别只是方法返回值不同
JSONObject jsonObject = obj.fluentPut("zxc", "zxc");
System.out.println(obj);
HashMap map = new HashMap<String,Object>();
map.put("1","1");
map.put("2","2");
JSONObject jsonObject2 = obj.fluentPutAll(map);
关于 gjson
//------- 初始化 -------
//方式一:只有一个无参构造方法
JsonObject json = new JsonObject();
json.addProperty("name", "John");
json.addProperty("sex", "John");
System.out.println(obj);
//------- 一些简单常用的方法 -------
//内部维护:LinkedTreeMap 所以会有一些节点的概念
//addProperty
//添加值
JsonObject json = new JsonObject();
json.addProperty("name","John");
//get
//获取值,返回对象是JsonElement
JsonElement qwe = json.get("name");
System.out.println(qwe);