一、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). jackson的注解:

1)、@JsonIgnore:排除属性。(对应属性的键值对就不会被转换成json字符串了)
2)、@JsonFormat:属性值得格式化(转换成不同的格式),即将Date类型的日期格式化
  * @JsonFormat(pattern = "yyyy-MM-dd")

3)、@JsonProperty:该注解用于指定 Java 属性与 JSON 属性之间的映射关系

4)、@JsonInclude:该注解用于指定序列化 Java 对象时包含哪些属性,加在实体类上,相当于全局配置中的ObjectMapper#setSerializationInclusion配置

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。

 

posted on 2021-05-07 23:38  周文豪  阅读(5630)  评论(0编辑  收藏  举报