JSON小记

简介: JSON小记

JSON学习

第一章

fastjson

import com.alibaba.fastjson import com.alibaba.fastjson.JSON;

pom依赖

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </dependency>


简介

这个包里面最主要也是最常用的两个类是 JSON JSONObject 这两个类也都是内部使用的是final map 来实现的。构造的时候可以传入一个ordered。来确定使用LinkedHashMap还是HashMap。看下面这个构造。还可以使用map入参来构造jsonObject。也可以看到jsonobject实际上是json的子类。有一个特征就是 jsonObject是没有static方法的。我们打点出来的静态方法都是JSON那边继承过来的。就不往深挖源码了,知道大概就好。


测试1:

关于json字符串转对象和字符串转json.  JavaBean、Collection、Map、Date、Enum、都可以


测试2:

parseArray(jsonStr,Class)   List   jsonArray跟List一样


JSONObject   实现了Map 接口。看下面方法好多跟map瞅着一样



下面为例子json。data的value可以看成List persion有name属性。 instance可以看成Map(对象的json字符串形式)


测试一代码如下:

@Test
public void myTest(){
    Person person = new Person();
    person.setName("郭洋");
    person.setAge(23);
    String str = JSON.toJSONString(person);// 把对象转化成json字符串
    System.out.println(str); // 输出:{"age":23,"name":"郭洋"}
    // 这个方法可以将Json字符串转成任意的javabean、Map、集合也可以。
    // 不指定后面的class就会转成JSONobject,
    // 若指定转成那个class,前面就要用那个class的实例去接收
    Person person1 = JSON.parseObject(str,person.getClass());// 转成Person类的实例对象
    System.out.println(person1);// Person(name=郭洋, age=23)
    JSONObject jsonObject = JSON.parseObject(str);// 不指定json字符串要转成那个class对象实例,默认转成JSONObject对象实例
    System.out.println(jsonObject);// {"name":"郭洋","age":23}
    Map<Integer,Double> map = new HashMap<>();
    map.put(1,1.2);
    map.put(2,1.2);
    map.put(3,1.2);
    map.put(4,1.2);
    String strMap = JSON.toJSONString(map);// 将Map转成json字符串
    System.out.println(strMap);// {1:1.2,2:1.2,3:1.2,4:1.2}
    Map strMap1 = JSON.parseObject(strMap);// 将json字符串转化成map对象
    System.out.println(strMap1);// {"1":1.2,"2":1.2,"3":1.2,"4":1.2}
}
// 输出:
//{"age":23,"name":"郭洋"}
//Person(name=郭洋, age=23)
//{"name":"郭洋","age":23}
//{1:1.2,2:1.2,3:1.2,4:1.2}
//{"1":1.2,"2":1.2,"3":1.2,"4":1.2}

测试二代码如下:

@Test
public void myTest2(){
    Person person = new Person();
    person.setName("郭洋2");
    person.setAge(22);
    Person person1 = new Person();
    person1.setName("郭洋1");
    person1.setAge(21);
    List<Person> personList = new ArrayList<>();
    personList.add(person);
    personList.add(person1);
    String str = JSON.toJSONString(personList);// 将List转成Json字符串
    System.out.println(str);// [{"age":22,"name":"郭洋2"},{"age":21,"name":"郭洋1"}]
    System.out.println("*****************************");
    List list = JSON.parseObject(str,personList.getClass());// 将json字符串转化成数组对象
    for (Object o : list) {
        System.out.println(o);  //{"name":"郭洋2","age":22}
                                //{"name":"郭洋1","age":21}
    }
    System.out.println("*****************************");
    JSONArray objects = JSON.parseArray(str);// 将json字符串转化成JSONArray对象
    System.out.println(objects);// [{"name":"郭洋2","age":22},{"name":"郭洋1","age":21}]
    System.out.println("*****************************");
    List<Person> personList1 = JSON.parseArray(str,Person.class);
    System.out.println(personList1);// [Person(name=郭洋2, age=22), Person(name=郭洋1, age=21)]
    System.out.println("*****************************");
}
//输出:
//[{"age":22,"name":"郭洋2"},{"age":21,"name":"郭洋1"}]
//*****************************
//{"name":"郭洋2","age":22}
//{"name":"郭洋1","age":21}
//*****************************
//[{"name":"郭洋2","age":22},{"name":"郭洋1","age":21}]
//*****************************
//[Person(name=郭洋2, age=22), Person(name=郭洋1, age=21)]
//*****************************

参考:https://blog.csdn.net/finalheart/article/details/86073477


第二章

Java中TypeReference用法说明

用途、测试

在使用fastJson时,对于泛型的反序列化很多场景下都会使用到TypeReference,例如:


parseObject()方法同理

  • getObject(key,xxx.class)
  • 传入类对象的时候
  • 再不破坏数据结构的情况下,传啥,返回的类型就是啥。
  • getObject(key,new TypeReference< Xxx >() {})
  • 传入TypeReference时,
  • 传啥返回的类型都是Object,再不破坏数据结构的情况下,传入啥类型就用啥类型去接收返回值就可以。
  • parseObject(str,xxx)方法同理(将JSON字符串转化成对应的对象,str:json字符串、xxx要转成的对象类型)
  • xxx若为xxx.class时、或new TypeReference>() {}
  • 传啥返回值的类型就是啥


测试parseObject()方法

若传入的类型有泛型就会编译不通过

想传入带有泛型的类型,就是用new TypeReference< List >() {} 即可


测试:

  • 传new TypeReference< List >() {}
List<Person> personList2 = JSONObject.parseObject(str, new TypeReference<List<Person>>(){});
for (Person person2 : personList2) {
    System.out.println(person2);
}
//输出:
//Person(name=郭洋2, age=22)
//Person(name=郭洋1, age=21)
  • 传List.class
List list1 = JSONObject.parseObject(str, List.class);
for (Object o : list1) {
    System.out.println(o);
}
//输出
//{"name":"郭洋2","age":22}
//{"name":"郭洋1","age":21}

疑惑:

1、JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别

parseObject(String str)的作用

  • JSON.parseObject(String str)是将str转化为相应的JSONObject对象,其中str是“键值对”形式的json字符串,转化为JSONObject对象之后就可以使用其内置的方法,进行各种处理了。

JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别

  • 根据源码显示:JSON是一个抽象类,JSON中有一个静态方法parseObject(String text),将text解析为一个JSONObject对象并返回;JSONObject是一个继承自JSON的类,当调用JSONObject.parseObject(result)时,会直接调用父类的parseObject(String text)。所以两者没什么区别,一个是用父类去调用父类自己的静态的parseObject(String text),一个是用子类去调用父类的静态parseObject(String text),两者调的是同一个方法。
JSONObject json=JSON.parseObject(params); // parms:字符串   把字符串转为JSONObject对象







参考:https://www.cnblogs.com/fu512/p/7595144.html

相关文章
|
存储 SQL 搜索推荐
业务系统架构实践总结
作者从2015年起至2022年,在业务平台(结算、订购、资金)、集团财务平台(应收应付、账务核算、财资、财务分析、预算)、本地生活财务平台(发票、结算、预算、核算、稽核)所经历的业务系统研发实践的一个总结。1.核心是面向复杂性业务支撑的实践经验(个人概念里的“复杂业务“,大概至少面向5类行业若干业务线且业态差异很大),文章不涉及性能、稳定性、资损防控、大数据离线研发,聚焦在线业务系统架构对多态业务的包容性、开放性、灵活性、可读性。2.文章较多强调”个人”两字,因为仅是我个人在实践上归纳总结的一些方式方法。3.实践经验主要来自两类,一类是接手旧系统,得以见识不一样的设计,文中“见过”特指。
2748 32
|
前端开发 Java 关系型数据库
SpringBoot基于官网构建及项目快速启动
SpringBoot基于官网构建及项目快速启动
421 0
|
开发工具
Vim教程:深入了解如何删除换行符
【4月更文挑战第3天】
605 1
Vim教程:深入了解如何删除换行符
|
10月前
|
SQL
[Err] 1052 - Column ‘roleId‘ in where clause is ambiguous
这篇文章解释了SQL查询中出现"Column ‘roleId’ in where clause is ambiguous"错误的原因,即在多表查询中,如果没有明确指定表名,相同的列名在where子句中会产生歧义,并提供了修正方法,即明确指定条件中所引用的列属于哪个表。
|
缓存 监控 安全
在 Spring Boot 中使用 AOP(Aspect-Oriented Programming)实现日志记录功能
在 Spring Boot 中使用 AOP(Aspect-Oriented Programming)实现日志记录功能
505 1
|
前端开发 Java 开发者
在Spring框架中,`PathMatcher`是用于进行URL路径匹配的接口
在Spring框架中,`PathMatcher`是用于进行URL路径匹配的接口
410 6
|
12月前
|
Java
java使用Stream流找出集合对象中最小值
java使用Stream流找出集合对象中最小值
550 1
|
存储 Java API
使用Integer而不是int的场景和优势解析
使用Integer而不是int的场景和优势解析
354 0
|
分布式计算 安全 大数据
MaxCompute操作报错合集之创建oss外部表时出现了报错:"Semantic analysis exception - external table checking failure, error message:,该怎么办
MaxCompute是阿里云提供的大规模离线数据处理服务,用于大数据分析、挖掘和报表生成等场景。在使用MaxCompute进行数据处理时,可能会遇到各种操作报错。以下是一些常见的MaxCompute操作报错及其可能的原因与解决措施的合集。
354 1
|
缓存 关系型数据库 MySQL
为什么MySQL分页查询偏移量越大查询越慢
【5月更文挑战第1天】为什么MySQL分页查询偏移量越大查询越慢
478 4