一、Map與JSONObject區別
相同點:
都可以存key-value;
不同點:
(1)JSONObject 不可以存空,Map可以存空。
(2)Map由jdk提供,JsonObject需要第三方jar包提供。
import com.alibaba.fastjson.JSONObject;
依賴
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency>
(3)轉String后,數據格式不同。JSONObject是標准的json格式。
請求第三方接口需要標准的json格式,一般使用JSONObject。
可以將map轉成JSONObject
com.alibaba.fastjson.JSONObject jsonInfo = new com.alibaba.fastjson.JSONObject(requestMap);
即通過JSONObject的構造方法轉成JSONObject。
public JSONObject(Map<String, Object> map) { if (map == null) { throw new IllegalArgumentException("map is null."); } else { this.map = map; } }
例子:
public class mapTest1 { public static void main(String[] args) { //創建 map對象 Map<String, Object> map = new HashMap<String, Object>(); //添加元素到集合 map.put("黃曉明", "楊穎"); map.put("文章", "馬伊琍"); map.put("鄧超", "孫儷"); System.out.println(map); System.out.println(map.toString()); JSONObject jsonObject = new JSONObject(map); System.out.println(jsonObject); map.put("張三", null); System.out.println(map); } }
結果如下:
{鄧超=孫儷, 文章=馬伊琍, 黃曉明=楊穎} {鄧超=孫儷, 文章=馬伊琍, 黃曉明=楊穎} {"鄧超":"孫儷","文章":"馬伊琍","黃曉明":"楊穎"} {鄧超=孫儷, 張三=null, 文章=馬伊琍, 黃曉明=楊穎}
二、JSON相關知識:
概念: JavaScript Object Notation, JavaScript對象表示法
* json現在多用於存儲(數據)和交換文本信息的語法
* 進行數據的傳輸
* JSON 比 XML 更小、更快(在網絡中傳輸的速度比XML更快),更易解析(比XML解析更快,即傳過去一個JSON數據,用代碼獲取數據比XML更方便)。
把對象當參數傳遞數據。
1. 基本規則 * 數據在名稱/值對中:json數據是由鍵值對構成的。
* 鍵用引號(單雙都行)引起來,也可以不使用引號。注意:要加引號就都加引號,要不加引號就都不加引號
* 值得取值類型:
1. 數字(整數或浮點數) 3.14,數字類型不要加引號
2. 字符串(在雙引號中) "plain_text"
3. 數組(在方括號中) {"persons":[{},{}]} JSON中可以嵌套數組,即大括號中可以嵌套方括號,數組類型不要加引號
4. 對象(在花括號中) {"address":{"province":"陝西"....}},大括號與大括號之間可以相互嵌套,對象類型不要加引號
5. null和邏輯值(true 或 false)
* 數據由逗號分隔:多個鍵值對由逗號分隔
* 花括號保存對象:使用{}定義json 格式, {
"a"
: 1,
"b"
: [1, 2, 3]}
* 方括號保存數組:[] , [1, 2,
"3"
, {
"a"
: 4}]
2. 通過JSON對象獲取JSON中存儲的數據
基本格式JSON對象獲取值
1).獲取鍵對應的值: json對象.鍵名 var name = person.name;
2).獲取鍵對應的值: json對象["鍵名"] var name = person["name"];
注意:通過打點的方式后面加鍵的名稱,不需要加引號,通過中括號的方式需要加引號,單引號和雙引號都可以
數組對象獲取值
數組對象[索引],即數組對象通過索引來獲取
3、JSON的遍歷
1)、基本格式的遍歷,
使用for in 循環,此時只能用中括號的方式來獲取鍵對應的值,因為key是字符串
2)、數組格式的遍歷,
使用雙層for循環
Person p = new Person(); p.setName("張三"); p.setAge(23); p.setGender("男");
// 以上是java中封裝零散的數據,
// 那么JavaScript中如何用對象封裝數據呢?通過JSON數據格式來實現,用JSON來表示對象 var p = {"name":"張三","age":23,"gender":"男"};
//1.定義基本格式
var person = {"name": "張三", age: 23, 'gender': true};(json對象) //json字符串
//2.嵌套格式: {}嵌套[]
var persons = {
"persons": [
{"name": "張三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
]//json數組
};
var name1 = persons.persons[2].name;
//3.嵌套格式: []嵌套{} ,即中括號中嵌套大括號,JSON數組,數組中放多個JSON對象。
var ps = [{"name": "張三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}];(數組對象,即將json對象裝在數組中)
alert(ps[1].name);
//對 json數組進行遍歷,獲取ps中的所有值(雙層for循環)
for (var i = 0; i < ps.length; i++) {
var p = ps[i];
for(var key in p){
alert(key+":"+p[key]);
}
}
三、JSON數據和Java對象的相互轉換
把JSON當做數據的載體進行傳輸,客戶端與服務器端進行同行的時候,JSON是數據的載體。客戶端支持JSON的解析,而服務器端拿到JSON數據之后,將JSON數據轉換成java對象。當然,java對象也可以轉換成JSON數據,再傳送給客戶端。
JSON解析器(parser):(封裝好的一些工具類)
常見的解析器:Jsonlib,Gson,fastjson(阿里巴巴),jackson(是spring mvc框架內置的解析器)
1、使用Jackson來進行javaJSON對象或java對象與JSON字符串之間的的相互轉換(了解)
1. JSON轉為Java對象----readValue(了解,用得不多)
使用步驟
1). 導入jackson的相關jar包
2). 創建Jackson核心對象 ObjectMapper
3). 調用ObjectMapper的相關方法進行轉換
readValue(json字符串數據,Class)(class為轉成的對象的類型,如person.class)
2. Java對象轉換JSON(字符串)---writeValueAsString
1). 導入jackson的相關jar包(3個,位於WEB-INF/lib目錄下)
2). 創建Jackson核心對象 ObjectMapper mapper=new ObjectMapper();
3). 調用ObjectMapper的相關方法進行轉換
(1). 轉換方法:
* writeValue(參數1,obj):有多種重載方式
參數1:
File:將obj對象轉換為JSON字符串,並保存到指定的文件中
Writer:將obj對象轉換為JSON字符串,並將json數據填充到字符輸出流中
OutputStream:將obj對象轉換為JSON字符串,並將json數據填充到字節輸出流中
@Test public void test1() throws Exception { Person p = new Person(); p.setName("張三"); p.setAge(1); p.setGender("男"); p.setBirthday(new Date()); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new File("F://a.txt"),p); }
mapper.writeValue(response.getOutPutStream(),person);
@Test public void test1() throws Exception { Person p = new Person(); p.setName("張三"); p.setAge(1); p.setGender("男"); p.setBirthday(new Date()); ObjectMapper mapper = new ObjectMapper(); mapper.writeValue(new FileWriter("F://b.txt"),p); }
* writeValueAsString(obj):將對象轉為json字符串
@Test public void test1() throws JsonProcessingException { Person p = new Person(); p.setName("張三"); p.setAge(1); p.setGender("男"); p.setBirthday(new Date()); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(p); System.out.println(json); }
(2). 注解:
1). @JsonIgnore:排除屬性。(對應屬性的鍵值對就不會被轉換成json字符串了)
2). @JsonFormat:屬性值得格式化(轉換成不同的格式),即將Date類型的日期格式化
* @JsonFormat(pattern = "yyyy-MM-dd")
Person實體類
public class Person { private String name; private int age; private String gender; @JsonFormat(pattern = "yyyy-MM-dd") private Date birthday; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", gender='" + gender + '\'' + ", birthday=" + birthday + '}'; } }
測試方法
@Test public void test2() throws JsonProcessingException { Person p1 = new Person(); p1.setName("張三"); p1.setAge(1); p1.setGender("男"); p1.setBirthday(new Date()); Person p2 = new Person(); p2.setName("張三"); p2.setAge(1); p2.setGender("男"); p2.setBirthday(new Date()); Person p3 = new Person(); p3.setName("張三"); p3.setAge(1); p3.setGender("男"); p3.setBirthday(new Date()); List<Person> list=new ArrayList<Person>(); list.add(p1); list.add(p2); list.add(p3); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(list); System.out.println(json); }
結果:
[{"name":"張三","age":1,"gender":"男","birthday":"2021-05-07"},{"name":"張三","age":1,"gender":"男","birthday":"2021-05-07"},{"name":"張三","age":1,"gender":"男","birthday":"2021-05-07"}]
(3). 復雜java對象轉換
1). List:轉成數組(將對象放在集合中,把集合對象傳入方法中,得到一個數組,數組中放的是三個對象),list集合中的對象有序
String json = mapper.writeValueAsString(list);
2). Map:與對象格式一致(map集合中放的是鍵值對,然后將map對象傳入方法中,轉換為JSON字符串),與JAVA對象轉換成JSON是一樣的,鍵值對無序,
@Test public void test3() throws JsonProcessingException { Map<String,Object> map=new HashMap<String,Object>(); map.put("name","張三"); map.put("age",1); map.put("gender","男"); map.put("birthday","1988-09-10"); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(map); System.out.println(json); }
2、使用fastjson來進行JSON對象或java對象與JSON字符串之間的的相互轉換(重點)
0、java字符串轉JSONObject
方法一:
JSONObject jo = new JSONObject(new String(需要轉換的字符串));
方法二:
JSONObject jo = JSONObject.parseObject(new String(需要轉換的字符串));
例子:
Object result = null; JSONObject jo = JSONObject.parseObject(new String(result.toString()));
1、把java對象轉為json字符串
JSON.toJSONString(Object);
示例:
Map<String,Object> map=new HashMap<>(); map.put("name","張三"); map.put("age",20); String s = JSON.toJSONString(map); System.out.println(map);//{name=張三, age=20} System.out.println(s);//{"name":"張三","age":20}
2、把JSON對象轉為json字符串
json.toJSONString()
示例:
JSONObject json=new JSONObject(); json.put("name","李四"); json.put("age",20); String s = json.toJSONString(); System.out.println(json);//{"name":"李四","age":20} System.out.println(s);//{"name":"李四","age":20}
3、把json字符串轉為java對象。
JSON.parseObject(jsonStr, Object.class);
示例:
String s = " {\"name\":\"張三\",\"age\":20}"; Map map = JSON.parseObject(s, Map.class); System.out.println(map);//{name=張三, age=20} System.out.println(s);//{"name":"張三","age":20}
另外一種方式:
EscProManage escProManage = JSONObject.parseObject(JSONObject.toJSONString(map), EscProManage.class);
4、把java對象轉為JSON對象。
JSON.toJSON(Object);
或者
JSONObject.toJSON(Object);
示例:
Map<String,Object> map=new HashMap<>(); map.put("name","張三"); map.put("age",20); JSONObject s = (JSONObject) JSON.toJSON(map); System.out.println(map);//{name=張三, age=20} System.out.println(s);//{"name":"張三","age":20}
將json轉為java對象
User user = jsonObject.toJavaObject(User.class);
5、通過鍵從JSON對象中獲取JSON數組。
JSONArray arr = json.getJSONArray(key);
示例:
Map<String,Object> map=new HashMap<>(); ArrayList<User> list=new ArrayList(); list.add(new User("張三","123456")); list.add(new User("李四","456155")); list.add(new User("王五","893456")); map.put("user",list); map.put("time",new Date()); System.out.println(map);// JSONObject json = (JSONObject) JSON.toJSON(map); System.out.println(json); //把json字符串轉為數組 JSONArray users = json.getJSONArray("user"); //遍歷數組 for (int i = 0; i < users.size(); i++) { JSONObject user = users.getJSONObject(i); System.out.println(user); System.out.println(user.get("name"); }
6、將JSONArray轉換成List集合
jsonArray.toJavaList(Object.class)
示例:
List<AttachFile> attachFiles = jsonArray.toJavaList(AttachFile.class);
7、往JSON對象中設置鍵值對
jsonObject.put(key,value);
示例:
jsonObject.put("tabs", tabs);
8、從JSON對象中獲取值
Object jsonObject.get(key)
實例:
Date crudeProDate = json.get("importDate") == null ? (Date) json.get("productionDate") : (Date) json.get("importDate");
如果對應key的value為字符串,可以使用getString(key)方法
String jsonObject.getString(key)
示例:
String username = jsonObj.getString("username");
如果對應的key的value為int類型,可以使用getIntValue(String key,int defaultValue),示例如下:
int page = params.containsKey("page") ? params.getIntValue("page", 1) : 1;
這樣,不管params中是否存在key或者key是否有值,都會給key一個默認值1。
類似的用法還有:
public long getLongValue(String key, long defaultValue);
9、獲取JSONObject對象中鍵值對的數量
int size()
示例:
int size = jsonObject.size();
10、判斷該JSONObject對象是否為空
boolean isEmpty()
示例:
boolean result = jsonObject.isEmpty();
11、判斷是否有需要的key值
containsKey(Object key)
示例:
boolean result = jsonObject.containsKey("name");
12、判斷是否有需要的value值
boolean containsValue(Object value)
示例:
boolean result = jsonObject.containsValue("王五");
13、如果JSONObjct對象中的value是一個JSONObject對象,即根據key獲取對應的JSONObject對象
JSONObject getJSONObject(String key)
示例:
//7.JSONObjct對象中的value是一個JSONObject對象,即根據key獲取對應的JSONObject對象; JSONObject object2 = new JSONObject(); //將jsonobject對象作為value進行設置 object2.put("student1", object1); JSONObject student =object2.getJSONObject("student1");
14、如果JSONObject對象中的value是一個JSONObject數組,既根據key獲取對應的JSONObject數組
JSONArray getJSONArray(String key)
示例:
//8.如果JSONObject對象中的value是一個JSONObject數組,既根據key獲取對應的JSONObject數組; JSONObject objectArray = new JSONObject(); //創建JSONArray數組 JSONArray jsonArray = new JSONArray(); //在JSONArray數組設值:jsonArray.add(int index, Object value); jsonArray.add(0, "this is a jsonArray value"); jsonArray.add(1, "another jsonArray value"); objectArray.put("testArray", jsonArray); //獲取JSONObject對象中的JSONArray數組 JSONArray jsonArray2 = objectArray.getJSONArray("testArray");
15、根據key清除某一個鍵值對
Object remove(Object key)
示例:
//9.remove.根據key移除JSONObject對象中的某個鍵值對 object1.remove("name");
16、獲取JSONObject中的key,並將其放入Set集合中
Set<String> keySet()
示例:
//10.取得JSONObject對象中key的集合 Set<String> keySet= jsonObject.keySet(); for (String key : keySet) { System.out.print(" "+key); }
17、在循環遍歷時使用,取得是鍵和值的映射關系
Set<Map.Entry<String, Object>> entrySet()
示例:
//11.取得JSONObject對象中的鍵和值的映射關系 Set<Map.Entry<String, Object>> entrySet = jsonObject.entrySet(); for (Entry<String, Object> entry : entrySet) { System.out.println(entry); }
請求體示例:
{ "data":{ "CURCODE":["123123123","3333333333"], "USER_NAME":"掃碼用戶名", "SCAN_TIME":"掃碼時間", "PHONE_NO":"掃碼人員電話號", "SALE_TO_NO":"銷售對象標識", "SALE_TO_NAME":"銷售對象名稱", "ORDER_NO":"流水單號", "ORDER_TYPE":"單據類型"} }
獲取參數:
@RequestMapping("/saleOut") @ResponseBody public JSONObject saleOut(@RequestBody JSONObject params) { JSONObject result = new JSONObject(); try { JSONObject jsonObject = params.getJSONObject("data"); JSONArray jsonArray = jsonObject.getJSONArray("CURCODE"); for (int i = 0; i < jsonArray.size(); i++) { String curcode = jsonArray.getString(i); .... } } catch (Exception e) { e.printStackTrace(); result.put("msg", "失敗"); } return result; }
四、JSONObject的常規命令
1、getList
public class demo8 { public static void main(String[] args) { JSONObject jsonObject = new JSONObject(); List<String> list = new ArrayList<>(); list.add("2022-09-02"); list.add("2022-09-30"); jsonObject.put("produceDate",list); System.out.println(jsonObject); List<String> produceDate = jsonObject.getList("produceDate", String.class); System.out.println(produceDate); } }
用處:當前端傳遞到后台的為選擇日期范圍的日期時,后台可以通過getList方法獲取List集合,進而得到beginDate和endDate。