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);