Map與JSONObject區別,使用Jackson或fastjson來進行JSON對象或java對象與JSON字符串之間的的相互轉換


一、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":""};
//對json對象進行遍歷,獲取person對象中所有的鍵和值
//for in 循環
for(var key in person){
  //key默認是字符串
  //這樣的方式獲取不行。因為相當於 person."name"
  //alert(key + ":" + person.key);
  alert(key+":"+person[key]);   
}

//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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM