前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java中json字符串和java对象的转换「建议收藏」

java中json字符串和java对象的转换「建议收藏」

作者头像
全栈程序员站长
发布2022-10-05 09:35:33
3.1K0
发布2022-10-05 09:35:33
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

文章目录

1、Java与前台的交互

  • 作为后台,Java不仅需要接收前台传递过来的数据,还需要将数据库中的数据查出来打包好发给前台,无论是接收还是发送的数据,都是以JSON字符串的形式存在的;
  • JSON数据详解
  • 我们在发送JSON字符串的时候,可以选择手动拼串,但是这样显然很繁琐,同样,接收前台返回来的JSON字符串,解析该字符串也会显得很繁琐;
  • 我们可以使用一些第三方的工具类进行处理;

常见的JSON解析器:

Jsonlib,Gson,fastjson,jackson;

2、解析JSON的第三方工具

  • Gson

Gson是目前功能最全的Json解析神器,它当初是为因应Google公司内部需求而由Google自行研发而来,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。 Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。 在使用这种对象转换之前,需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。 类里面只要有get和set方法,Gson完全可以实现复杂类型的json到bean或bean到json的转换,是JSON解析的神器。

  • FastJson

Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的jar,能够直接跑在JDK上。 FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。 FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。

  • Jackson

项目地址

Jackson是当前用的比较广泛的,用来序列化和反序列化json的Java开源框架。Jackson社区相对比较活跃,更新速度也比较快, 从Github中的统计来看,Jackson是最流行的json解析器之一,Spring MVC的默认json解析器便是Jackson。

Jackson优点很多:

  • Jackson 所依赖的jar包较少,简单易用;
  • 与其他 Java 的 json 的框架 Gson 等相比,Jackson 解析大的 json 文件速度比较快;
  • Jackson 运行时占用内存比较低,性能比较好;
  • Jackson 有灵活的 API,可以很容易进行扩展和定制。
  • Jackson 的核心模块由三部分组成:
在这里插入图片描述
在这里插入图片描述

jackson-core 核心包 提供基于”流模式”解析的相关 API,它包括JsonPaserJsonGenerator。Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。 jackson-annotations注解包,提供标准注解功能; jackson-databind 数据绑定包,提供基于”对象绑定” 解析的相关 API( ObjectMapper )和”树模型” 解析的相关 API(JsonNode);基于”对象绑定” 解析的 API 和”树模型”解析的 API 依赖基于”流模式”解析的 API。

  • Json-lib

json-lib最开始的也是应用最广泛的json解析工具,json-lib 不好的地方确实是依赖于很多第三方包,对于复杂类型的转换,json-lib对于json转换成bean还有缺陷, 比如一个类里面会出现另一个类的list或者map集合,json-lib从json到bean的转换就会出现问题。json-lib在功能和性能上面都不能满足现在互联网化的需求。

3、JSON数据和Java对象的相互转换

Java对象转换JSON字符串

  • 使用步骤:

1、导入jackson的相关jar包 2、创建Jackson核心对象 ObjectMapper 3、调用ObjectMapper的相关方法进行转换

根目录下创建lib目录,将解析器文件放在lib目录下,并对lib右键选择add as library产生依赖

单个对象转为JSON字符串

代码语言:javascript
复制
		User user = new User("scq", "123");
        //Java对象转换成JSON字符串
        ObjectMapper mapper = new ObjectMapper();
        String s = mapper.writeValueAsString(user);
        System.out.println(s);
        //{"username":"scq","password":"123"}
  • 根据JSON字符串的键值对设计一个java类 ,键的类型名字是类的属性类型和名字,值是json数组对应属性是java集合List,值是json字符串,对应属性是java类的对象;并设置getset方法
  • java对象的属性名是Json字符串的键,Json字符串的值的类型是java对象属性的类型。在类中必须提供getset方法解析器才可以将Json字符串来回解析

User类如下:

代码语言:javascript
复制
public class User { 

private String username;
private String password;
public User() { 

}
public User(String username, String password) { 

this.username = username;
this.password = password;
}
public String getUsername() { 

return username;
}
public void setUsername(String username) { 

this.username = username;
}
public String getPassword() { 

return password;
}
public void setPassword(String password) { 

this.password = password;
}
@Override
public String toString() { 

return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
}

writeValueAsString(obj)——将对象转为json字符串

将对象放入单列集合转为JSON字符串

很多对象放到集合中,解析器将这个集合转换为JSON字符串数组,数组中每一个元素是JSON字符串

代码语言:javascript
复制
User user2 = new User("李四", "123456");
User user3 = new User("王五", "123456");
User user4 = new User("赵六", "123456");
List<User> list = new ArrayList<>();
list.add(user2);
list.add(user3);
list.add(user4);
ObjectMapper mapper1 = new ObjectMapper();
String s1 = mapper1.writeValueAsString(list);
System.out.println(s1);
//[{"username":"李四","password":"123456"},{"username":"王五","password":"123456"},{"username":"赵六","password":"123456"}]

可以看到最终转换出来的结果是JSON数组格式;

将对象放入双列集合转为JSON字符串

代码语言:javascript
复制
//对于HashMap这样的集合存储对象,来看一看解析器转换为JSON字符串时的键值对是什么
HashMap<String, User> hashMap = new HashMap<>();
hashMap.put("user1",user);
hashMap.put("user2", user2);
hashMap.put("user3", user3);
hashMap.put("user4", user4);
String s2 = mapper.writeValueAsString(hashMap);
//{"user1":{"username":"scq","password":"123"},"user2":{"username":"李四","password":"123456"},"user3":{"username":"王五","password":"123456"},"user4":{"username":"赵六","password":"123456"}}
System.out.println(s2);
//把转换好的JSON数据存储到文件中
mapper.writeValue(new File("hashMapJson.json"),hashMap);

可以看到最终转换的结果是JSON嵌套的格式

一个对象内部维护了另外一个对象转为JSON字符串

代码语言:javascript
复制
//Person对象中有多中类型属性的JSON字符串转换
Car car = new Car("宝马", 20000, "白色");
Person person = new Person("scq1", "100", 100, car, list);
ObjectMapper mapper2 = new ObjectMapper();
mapper2.writeValue(new FileWriter("PersonStr.json"),person);:

结果为:

代码语言:javascript
复制
{ 

"name": "scq1",
"age": "100",
"sal": 100,
"car": { 

"carName": "宝马",
"carPrice": 20000.0,
"color": "白色"
},
"list": [{ 

"username": "李四",
"password": "123456"
}, { 

"username": "王五",
"password": "123456"
}, { 

"username": "赵六",
"password": "123456"
}]
}

可以看到,一个对象内部维护了另外一个对象的时候,任然可以转换为字符串,这时候的格式就类似于套娃; 一般我们将这个内部的类写为静态的内部类;

嵌套类详解

将转换过来的JSON字符串存入文本当中

writeValue(参数1,obj): 参数1: File:将obj对象转换为JSON字符串,并保存到指定的文件中 Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中 OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中

选择部分属性转为JSON字符串

  • 有的时候,我们只想转换部分数据返回给前台,并不想返回后台的全部数据,可以使用注解:

1、@JsonIgnore:排除某个属性不要转换成JSON,给类的属性上加上这个注解。 2、@JsonFormat:属性值得格式化日期字符串,取的是默认时区的时间

测试类

代码语言:javascript
复制
    Student student = new Student("张三", 23, '男',new Date());
ObjectMapper mapper = new ObjectMapper();
String s = mapper.writeValueAsString(student);
System.out.println(s);
//加入注解后,不显示sex,日期格式化
//{"name":"张三","age":23,"birthday":"2020-10-24 12:01:59"}

自定义类如下:

代码语言:javascript
复制
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import java.util.Date;
public class Student { 

private String name;
private int age;
@JsonIgnore  //忽略某个属性,不要转换成JSON
private char sex;
//把毫秒值转换为日期字符串
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date birthday;
public Student() { 

}
public Student(String name, int age, char sex) { 

this.name = name;
this.age = age;
this.sex = sex;
}
public Student(String name, int age, char sex, Date birthday) { 

this.name = name;
this.age = age;
this.sex = sex;
this.birthday = birthday;
}
public Date getBirthday() { 

return birthday;
}
public void setBirthday(Date birthday) { 

this.birthday = 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 char getSex() { 

return sex;
}
public void setSex(char sex) { 

this.sex = sex;
}
@Override
public String toString() { 

return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}';
}
}

get()和set(0不能省略,因为转换为JSON字符串的内部会用到这两个方法;

JSON字符串转为Java对象

1、导入jackson的相关jar包; 2、创建Jackson核心对象 ObjectMapper; 3、调用ObjectMapper的相关方法进行转换 4、readValue(json字符串数据,Class)

  • 把JSON字符串,转换成JSON对象,前提是 需要提供一个类,这个类的属性名和JSON字符串中的键名保持一致;java对象的属性名是Json字符串的键,Json字符串的值的类型是java对象属性的类型。在类中必须提供getset方法解析器才可以将Json字符串来回解析

测试类:

代码语言:javascript
复制
ObjectMapper mapper = new ObjectMapper();
String str="{\"data\":{\"yesterday\":{\"date\":\"23日星期五\",\"high\":\"高温 17℃\",\"fx\":\"东南风\",\"low\":\"低温 5℃\",\"fl\":\"<![CDATA[2级]]>\",\"type\":\"晴\"},\"city\":\"商洛\",\"forecast\":[{\"date\":\"24日星期六\",\"high\":\"高温 16℃\",\"fengli\":\"<![CDATA[2级]]>\",\"low\":\"低温 4℃\",\"fengxiang\":\"东南风\",\"type\":\"霾\"},{\"date\":\"25日星期天\",\"high\":\"高温 19℃\",\"fengli\":\"<![CDATA[1级]]>\",\"low\":\"低温 8℃\",\"fengxiang\":\"东南风\",\"type\":\"霾\"},{\"date\":\"26日星期一\",\"high\":\"高温 20℃\",\"fengli\":\"<![CDATA[2级]]>\",\"low\":\"低温 7℃\",\"fengxiang\":\"西北风\",\"type\":\"多云\"},{\"date\":\"27日星期二\",\"high\":\"高温 18℃\",\"fengli\":\"<![CDATA[1级]]>\",\"low\":\"低温 7℃\",\"fengxiang\":\"北风\",\"type\":\"雾\"},{\"date\":\"28日星期三\",\"high\":\"高温 14℃\",\"fengli\":\"<![CDATA[1级]]>\",\"low\":\"低温 4℃\",\"fengxiang\":\"东风\",\"type\":\"小雨\"}],\"ganmao\":\"感冒易发期,外出请适当调整衣物,注意补充水分。\",\"wendu\":\"12\"},\"status\":1000,\"desc\":\"OK\"}";
//将json字符串中的数据解析出来 存到到Weather对象中
Weather weather = mapper.readValue(str, Weather.class);
String date = weather.getData().getYesterday().getDate();
System.out.println(date);//23日星期五

提供的Weather类:我们选择使用GSONFormat插件来进行自动生成JSON字符串对应的类来进行存储。

GSONFormat插件

  • 有的时候我们需要解析的JSON字符串较为简单,可以自己定义实现类,但有的时候字符串非常复杂,这时候IDEA给我们提供了一款插件:GSONFormat,安装好这款插件之后,在Generate中找到它:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
v
v

上图是软件帮我们自动生成的属性;使用这个插件,简化了我们的代码量;

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月13日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 1、Java与前台的交互
  • 2、解析JSON的第三方工具
  • 3、JSON数据和Java对象的相互转换
    • Java对象转换JSON字符串
      • JSON字符串转为Java对象
      相关产品与服务
      数据保险箱
      数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档