一、JSON是什麼?
JSON是一種取代XML的數據結構,和xml相比,它更小巧但描述能力卻不差,由於它的小巧所以網絡傳輸數據將減少更多流量從而加快速度。
JSON就是一串字符串 只不過元素會使用特定的符號標註。
存儲結構是 KEY-VALUE
key爲string類型
value爲: String Boolean Number 數組 Object null
[] 中括號代表的是一個數組;
{} 大括號代表的是一個對象
"" 雙引號表示的是屬性值
:冒號代表的是前後之間的關係,冒號前面是屬性的名稱,後面是屬性的值,這個值可以是基本數據類型,也可以是引用數據類型。
"格式完好"的JSON,就是要求指定的字符串必須符合嚴格的JSON格式,屬性名稱必須加雙引號、字符串值也必須用雙引號。例如:
{
"name": "teacher",
"computer": {
"CPU": "intel7",
"disk": "512G"
},
"students": [
{
"name": "張三",
"age": 18,
"sex": true
},
{
"name": "李四",
"age": 19,
"sex": false
}
]
}
二、JSON生成以及解析
我們經常用到的是實體類轉換成JSONObject對象,以及解析JSON;
(1)四種實體類生成Json字符串:
public void EntityToJson() throws IOException {
Person person = new Person("張三", "男", 25);
//1、利用傳統方式
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", person .getName());
jsonObject.put("sex", person .getSex());
jsonObject.put("age", person .getAge());
System.out.println(jsonObject.toString());
//2、利用Jackson方式
ObjectMapper objectMapper = new ObjectMapper();
String jsonString = objectMapper.writeValueAsString(person);
//3、利用GSON方式
Gson gson = new Gson();
String jsonString = gson.toJson(person);
//4、利用FastJSON方式
Object jsonString = JSON.toJSON(person);
System.out.println(jsonString.toString());
}
(2)Json字符串生成實體類
JSON解析一定要掌握的兩條規則:
- 1.如果看到是{ }–>使用JSONObject
- 2.如果看到的[ ]–>使用JSONArray解析
public void JsonToEntity(){
String jsonString = "{\"sex\":\"男\",\"name\":\"張三\",\"age\":25}";
//1、利用傳統方式
JSONObject jsonObject = new JSONObject(jsonString);
Person person = new Person(jsonObject.get("name").toString(), jsonObject.get("sex").toString(), Integer.valueOf(jsonObject.get("age").toString()));
//2、利用Jackson方式
ObjectMapper objectMapper = new ObjectMapper();
Person person = objectMapper.readValue(jsonString, Person.class);
//3、利用GSON方式
Gson gson = new Gson();
Person person = gson.fromJson(jsonString, Person.class);
//4、利用FastJSON方式
Person person = JSON.parseObject(jsonString, Person.class);
}
另外:對於數組來說GSON和FastJSON各有自己的解析方式;詳細方法參照API;
List<String> list =gson.fromJson(json2, new TypeToken<List<String>>(){}.getType());
List<Person > person List =gson.fromJson(json3, new TypeToken<List<Person >>(){}.getType());
List<String> list = JSON.parseArray(json2, String.class);
List<Person > userList = JSON.parseArray(json3, Person .class);
(3)根據JSON建立對象
{
"desc": "OK",
"status": 1000,
"data": {
"wendu": "20",
"ganmao": "相對於今天將會出現大幅度降溫,易發生感冒,請注意適當增加衣服,加強自我防護避免感冒。",
"forecast": [
{
"fengxiang": "北風",
"fengli": "3-4級",
"high": "高溫 27℃",
"type": "中雨",
"low": "低溫 19℃",
"date": "6日星期五"
},
{
"fengxiang": "北風",
"fengli": "微風級",
"high": "高溫 23℃",
"type": "大雨",
"low": "低溫 17℃",
"date": "7日星期六"
},
{
"fengxiang": "北風",
"fengli": "微風級",
"high": "高溫 26℃",
"type": "小雨",
"low": "低溫 17℃",
"date": "8日星期天"
},
{
"fengxiang": "南風",
"fengli": "微風級",
"high": "高溫 27℃",
"type": "多雲",
"low": "低溫 15℃",
"date": "9日星期一"
},
{
"fengxiang": "南風",
"fengli": "微風級",
"high": "高溫 29℃",
"type": "多雲",
"low": "低溫 16℃",
"date": "10日星期二"
}
],
"yesterday": {
"fl": "微風",
"fx": "北風",
"high": "高溫 33℃",
"type": "陰",
"low": "低溫 22℃",
"date": "5日星期四"
},
"aqi": "58",
"city": "成都"
}
}
數據略大,不方便看,這裏給大家提供一個JSON在線解析工具http://www.bejson.com/count.html 自動格式化,方便觀看。
分析:
一: 第一個大括號(JSONObject){”desc”: “status”: “data”}
二:data裏面有一個大括號(JSONObject){”wendu” , “ganmao”, “forecast”, “yesterday”, “aqi”, “city” }
三:第二個大括號裏面有兩個對象 1.數組形“forecast”(JSONArray) 2.對象形“yesterday”( JSONObject )
而數組形裏面又套有數組的對象{}
開始封裝字段:
import java.util.List;
/**
* 對應的字段的封裝
*/
public class Weather {
// 外面大括號的字段封裝 setter getter toString
public String desc;
public int status;
public Data data;
@Override
public String toString() {
return "Weather [desc=" + desc + ", status=" + status + ", data="
+ data + "]";
}
}
class Data{
// 裏面大括號的字段封裝 setter getter toString
// 該類中包含有數組形和對象形,需要一併的封裝在裏面
public String wendu;
public String ganmao;
public List<Forecast> forecast;
public Yesterday yesterday;
public String aqi;
public String city;
@Override
public String toString() {
return "Data [wendu=" + wendu + ", ganmao=" + ganmao + ", forecast="
+ forecast + ", yesterday=" + yesterday + ", aqi=" + aqi
+ ", city=" + city + "]";
}
}
class Forecast{
// 數組裏面的大括號類型字段的封裝
public String fengxiang;
public String fengli;
public String high;
public String type;
public String low;
public String date;
@Override
public String toString() {
return "Forecast [fengxiang=" + fengxiang + ", fengli=" + fengli
+ ", high=" + high + ", type=" + type + ", low=" + low
+ ", date=" + date + "]";
}
}
class Yesterday{
// 最後{}的字段封裝
public String fl;
public String fx;
public String high;
public String type;
public String low;
public String date;
@Override
public String toString() {
return "Yesterday [fl=" + fl + ", fx=" + fx + ", high=" + high
+ ", type=" + type + ", low=" + low + ", date=" + date + "]";
}
}
將數據封裝成json格式
json有兩種格式:
(1)對象格式: JSONObject.fromObject{“key1”:obj,”key2”:obj,”key3”:obj…}
1、Map集合
Map map = new HashMap();
map.put("name", "json");
map.put("bool", Boolean.TRUE);
map.put("int", new Integer(1));
map.put("arr", new String[] { "a", "b" });
JSONObject json = JSONObject.fromObject(map);
————————————————
2、Bean
JSONObject jsonObject = JSONObject.fromObject(new JsonBean());
————————————————
(2)數組/集合格式: JSONArray.fromObject[obj,obj,obj…]
1、數組
boolean[] boolArray = new boolean[] { true, false, true };
JSONArray jsonArray1 = JSONArray.fromObject(boolArray);
————————————————
2、一般數據
JSONArray jsonArray2 = JSONArray.fromObject("['json','is','easy']" );
————————————————
3、List集合
List list = new ArrayList();
list.add( "first" );
list.add( "second" );
JSONArray jsonArray3 = JSONArray.fromObject( list );
————————————————
參考鏈接:
原文鏈接:https://blog.csdn.net/Xxacker/article/details/84949454
原文鏈接:https://blog.csdn.net/leosblog/article/details/80842640
原文鏈接:https://blog.csdn.net/lsh364797468/article/details/51347035
原文鏈接:https://blog.csdn.net/oman001/article/details/79063278