一、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). 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。