Google Gson API 介绍与使用

文章目录

  • Gson基本操作
  • Gson 概述与下载
  • Gson (反)序列化 Java 对象
  • JsonElement Json 元素
  • JsonObject Json 对象
  • JsonArray Json 数组
  • JsonParser Json 解析
  • GsonBuilder 构建 Gson
  • JsonElement的简单说明
      • JsonElement:
      • JsonPrimitive:
      • JsonNull:
      • JsonArray:
      • JsonObject:

Gson基本操作

String、JsonObject、JavaBean 互相转换

User user = new Gson().fromJson(jsonObject, User.class);User user = new Gson().fromJson(string, User.class);String string = new Gson().toJson(user);JsonObject jsonObject = new Gson().toJsonTree(user).getAsJsonObject();JsonObject jsonObject = new JsonParser().parse(string).getAsJsonObject();

String、JsonArray、List互相转换

List<User> userList = gson.fromJson(string, new TypeToken<List<User>>() {}.getType());List<User> userList = gson.fromJson(jsonArray, new TypeToken<List<User>>() {}.getType());String string = new Gson().toJson(userList);JsonArray jsonArray = new Gson().toJsonTree(userList, new TypeToken<List<User>>() {}.getType()).getAsJsonArray();JsonArray jsonArray = new JsonParser().parse(string).getAsJsonArray()

Gson 概述与下载

1、Java 解析 Json 最常用的类库有:google 的 Gson、阿里巴巴的 FastJson、以及 Jackson。这些都是非常优秀而且常用的库。

2、GSON 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库,可以快速的将一个 Json 字符转成一个 Java 对象,或者将一个 Java 对象转化为 Json 字符串。

3、gson 在 github 上开源地址:https://github.com/google/gson

Maven 依赖:gson 在 Maven 仓库地址:

<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.5</version>
</dependency>

Gson (反)序列化 Java 对象

1、com.google.gson.Gson 提供 toJson() 和 fromJson() 方法用于序列化与反序列化 Java 对象。

2、Gson 对象的 toJson 方法可以将 Java 基本数据类型、数组、以及 POJO 对象、List、Map 、JsonElement 等转为 json 格式的字符串,

3、Gson 对象的 fromJson 方法做与 toJson 相反的操作,将 json 格式的字符串转为基本数据类型、 POJO 对象、List、Map 、JsonElement 等

对象序列化
T fromJson(String json, Class classOfT)将指定的 Json 反序列化为指定类的对象,如果指定的类是泛型类型,则使用 fromJson(String, Type)方法。
T fromJson(String json, Type typeOfT)将指定的 Json 反序列化为指定类型的对象,如果指定的对象是泛型类型,则此方法很有用,对于非泛型对象,请改用 fromJson(String json, Class classOfT)
T fromJson(JsonElement json, Class classOfT)将指定的 json 元素反序列化为指定类型的对象,如果指定的类是泛型类型,则使用 fromJson(JsonElement, Type) 方法。
T fromJson(JsonElement json, Type typeOfT)
T fromJson(Reader json, Class classOfT) T fromJson(Reader json, Type typeOfT)将从指定字符输入流读取的Json反序列化为指定类的对象,如果指定的类是泛型类型,则调用 {@link#fromJson(Reader,type)}
序列化为对象
String toJson(Object src)将指定的对象序列化为其等效的Json表示形式,当指定的对象不是泛型类型时,应使用此方法,如果对象是泛型类型,请改用 toJson(object,type).
String toJson(Object src, Type typeOfSrc)将指定的对象(包括泛型类型的对象)序列化为其等效的Json表示形式,对于非泛型对象,请改用{@link#toJson(Object)}
String toJson(JsonElement jsonElement)将 JsonElement 转换为其等效的JSON表示形式。
JsonElement toJsonTree(Object src)将指定的对象序列化为 JsonElement 的等效表示形式,当指定的对象不是泛型类型时,应使用此方法;如果对象是泛型类型,请改用{@link#toJsonTree(object,type)}
JsonElement toJsonTree(Object src, Type typeOfSrc)

JsonElement Json 元素

1、JsonObject、JsonArray、JsonPrimitive、JsonNull 都是 JsonElement 的子类,JsonElement 常用方法:

JsonElement deepCopy()返回此元素的深层副本,克隆。
BigDecimal getAsBigDecimal()将此元素作为 BigDecimal 类型获取,如果元素不是 JsonPrimitive,则引发 ClassCastException, 如果元素不是有效的 BigDecimate,则 @throws NumberFormatException。 如果元素属于 JsonArray 类型,但包含多个元素,则引发 IllegalStateException。
BigInteger getAsBigInteger()将此元素作为 BigInteger 类型获取,如果元素不是 JsonPrimitive,则引发 ClassCastException, 如果元素不是有效的 BigInteger ,则 @throws NumberFormatException。 如果元素属于 JsonArray 类型,但包含多个元素,则引发 IllegalStateException。
boolean getAsBoolean()将此元素作为原始布尔值获取,如果元素不是 JsonPrimitive 并且不是有效的布尔值,则引发 ClassCastException, 如果元素属于 JsonArray 类型,但包含多个元素,则引发IllegalStateException
byte getAsByte()将此元素作为原始 byte 值获取,如果元素不是 JsonPrimitive 并且不是有效的布尔值,则引发 ClassCastException, 如果元素属于 JsonArray 类型,但包含多个元素,则引发IllegalStateException
其它 Java 基本数据类型也是同理:double getAsDouble()、char getAsCharacter()、float getAsFloat()、int getAsInt()、long getAsLong()、short getAsShort()
JsonArray getAsJsonArray()将此元素作为 JsonArray 获取,如果元素是其他类型的元素,则会生成 IlleglastateException 异常, 因此最好先调用 isJsonArray() 方法确保该元素是所需的类型,然后再使用此方法。
JsonObject getAsJsonObject()将此元素作为 JsonObject 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常, 因此最好先通过调用 isJsonObject() 方法来确保该元素是所需类型之后使用此方法。
JsonPrimitive getAsJsonPrimitive()将此元素作为 JsonPrimitive 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常, 因此最好先通过调用 isJsonPrimitive() 方法来确保该元素是所需的类型之后再使用此方法。JsonPrimitive 值可以是 Java 字符串、Java 基本数据类型及其包装器类型。
boolean isJsonArray()验证此元素是否为数组,如果此元素属于 JsonArray 类型,则返回 true,否则返回 false。
boolean isJsonNull()验证此元素是否表示 null 值,如果此元素的类型为 JsonNull,则返回 true,否则返回 false。
boolean isJsonObject()验证此元素是否为 JsonObject 对象。
boolean isJsonPrimitive()以验证此元素是否为 Java 数据类型。
    /*** JsonPrimitive getAsJsonPrimitive():* 将此元素作为 JsonPrimitive 获取,如果元素是其他类型的元素,则会引发 IlleglastateException 异常,* 因此最好先通过调用 isJsonPrimitive() 方法来确保该元素是所需的类型之后再使用此方法。JsonPrimitive 值可以是 Java 字符串、Java 基本数据类型及其包装器类型。*/@Testpublic void test12() {String json = "[\"本级小计\",368.00,328.00,]";JsonElement sourceJsonElement = new JsonParser().parse(json);JsonArray jsonArray = sourceJsonElement.getAsJsonArray();for (int i = 0; i < jsonArray.size(); i++) {JsonElement jsonElement = jsonArray.get(i);if (jsonElement.isJsonPrimitive()) {JsonPrimitive jsonPrimitive = jsonElement.getAsJsonPrimitive();if (jsonPrimitive.isString()) {System.out.println(jsonPrimitive.getAsString());} else if (jsonPrimitive.isNumber()) {System.out.println(jsonPrimitive.getAsDouble());}}}}

JsonObject Json 对象

add(String property, JsonElement value)添加一个健-值对的成员,名称必须是字符串,但值可以是任意的 JsonElement 类型。
addProperty(String property, Boolean value)添加布尔成员的便利方法,指定的值将转换为布尔值的 JsonPrimitive。
addProperty(String property, Character value)添加 char 成员的便利方法,指定的值将转换为字符的 JsonPrimitive。
addProperty(String property, Number value)添加 Number 成员的便利方法,指定的值将转换为数字的 JsonPrimitive。
addProperty(String property, String value)添加 String 成员的便利方法,指定的值将转换为数字的 JsonPrimitive。
Set<Map.Entry<String, JsonElement>> entrySet()返回此对象的所有成员,集合是有序的,与元素的添加顺序相同。
JsonElement get(String memberName)返回具有指定名称的成员。
JsonArray getAsJsonArray(String memberName)获取指定成员作为 JsonArray 的便利方法。
JsonObject getAsJsonObject(String memberName)获取指定成员作为 JsonObject 的便利方法。
JsonPrimitive getAsJsonPrimitive(String memberName)获取指定成员作为 JsonPrimitive 的便利方法。
boolean has(String memberName)检查此对象中是否存在具有指定名称的成员的便利方法。
Set keySet()返回所有成员的 key 值。
JsonElement remove(String property)从此 JsonObject 中删除指定的属性,返回被删除的属性。
int size()返回对象中键/值对的数目。
    /*** int size():返回对象中键/值对的数目。* Set<String> keySet():返回所有成员的键值*/@Testpublic void jsonObject7() {String json = "{\"pId\":9527,\"pName\":\"华安\",\"isMarry\":true}";JsonObject jsonObject = new JsonParser().parse(json).getAsJsonObject();System.out.println(jsonObject.size());Set<String> keySet = jsonObject.keySet();//3System.out.println(keySet);//[pId, pName, isMarry]}

JsonArray Json 数组

JsonArray()JsonArray(int capacity)两个构造器,一个是创建空的 Json 数组,一个是指定初始容量。
add( Boolean value)将指定的布尔值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(Character value)将指定的 Character 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(Number value)将指定的 Number 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(String value)将指定的 String 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
add(JsonElement value)将指定的 JsonElement 值添加到 json 数组,如 value 为 null,则添加 JsonNull。
addAll(JsonArray array)将指定数组中的所有元素添加到此 json 数组。
boolean contains(JsonElement element)如果此数组包含指定的元素,则返回true。
JsonElement get(int i)返回数组的第 i 个元素,如果下标越界,则抛异常
Iterator iterator()返回一个迭代器来导航数组的元,由于数组是一个有序列表,迭代器按照元素插入的顺序导航元素。
JsonElement remove(int index)删除此数组中指定位置的元素,向左移动任何后续元素(从其索引中减去一个),返回从数组中删除的元素。
boolean remove(JsonElement element)从该数组中删除第一个出现的指定元素(如果存在)。如果数组不包含元素,则它将保持不变。
JsonElement set(int index, JsonElement element)将此数组中指定位置的元素替换为指定元素,元素不能为null。
int size()返回数组的大小。
    @Testpublic void test4() {JsonArray jsonArray = new JsonParser().parse("[{\"code\":200,\"msg\":\"成功\"}]").getAsJsonArray();JsonArray deepCopy = jsonArray.deepCopy();deepCopy.add("Yes");System.out.println(jsonArray);//[{"code":200,"msg":"成功"}]System.out.println(deepCopy);//[{"code":200,"msg":"成功"},"Yes"]}

JsonParser Json 解析

1、JsonParser 用于将 Json 字符内容解析为 json 元素 JsonElement。

JsonElement parse(Reader json)将指定的 JSON 字符串字符输入流解析为 Json 元素,如果指定的文本不是有效的 JSON 字符串,则抛出 JsonParseException 异常。
JsonElement parse(String json)将指定的 JSON 字符串解析为 Json 元素,如果指定的文本不是有效的 JSON 字符串,则抛出 JsonParseException 异常。
    @Testpublic void test1() {String json = "{\"id\":1000,\"name\":\"华安\",\"birthday\":\"Jul 13, 2020 8:46:42 PM\",\"marry\":true}";JsonParser jsonParser = new JsonParser();JsonElement jsonElement = jsonParser.parse(json);JsonObject jsonObject = jsonElement.getAsJsonObject();System.out.println(jsonObject);//{"id":1000,"name":"华安","birthday":"Jul 13, 2020 8:46:42 PM","marry":true}}

GsonBuilder 构建 Gson

1、对于默认配置的 Gson,直接使用 new Gson 更简单,当需要设置默认值以外的配置选项时,使用 GsonBuilder 构建器,调用它的各种配置方法,最后调用 create 方法创建 Gson 对象。

GsonBuilder serializeNulls()序列化空字段,默认情况下,Gson 序列化期间会忽略所有为 null 的字段
GsonBuilder setDateFormat(String pattern)根据提供的模式序列化 Date 日期对象,可以多次调用,但只有最后一次调用将用于决定序列化格式。
GsonBuilder setFieldNamingPolicy(FieldNamingPolicy namingConvention)1、配置为在序列化和反序列化期间将特定命名策略应用于对象的字段。2、namingConvention:用于序列化和反序列化的 JSON 字段命名约定/策略,可选值如下:IDENTITY:使用对象默认的字段名称 UPPER_CAMEL_CASE:使用驼峰命名 UPPER_CAMEL_CASE_WITH_SPACES:将 Java 字段名的第一个’字母’在序列化为JSON格式时大写,单词之间用空格隔开 LOWER_CASE_WITH_UNDERSCORES:使用此命名策略将把 Java 字段名从大小写形式修改为全小写字段名,其中单词之间由下划线分隔 LOWER_CASE_WITH_DASHES:使用此命名策略将把 Java 字段名从大小写形式修改为全小写字段名,其中单词之间用破折号(-)分隔 LOWER_CASE_WITH_DOTS:使用此命名策略将 Java 字段名从大小写形式修改为全小写字段名,其中每个单词用点(.)分隔。
    @Testpublic void test1() {Gson gson = new GsonBuilder().serializeNulls().setDateFormat("yyyy-MM-dd HH:mm:ss").setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).create();Person person = new Person();person.setId(100);person.setBirthday(new Date());String toJson = gson.toJson(person);//{"id":100,"name":null,"birthday":"2020-07-19 11:37:35","marry":null}System.out.println(toJson);Person person1 = gson.fromJson(toJson, Person.class);//Person{id=100, name='null', birthday=Sun Jul 19 11:37:35 CST 2020, marry=null}System.out.println(person1);}

JsonElement的简单说明

JsonElement:

该类是一个抽象类,代表着json串的某一个元素。这个元素可以是一个Json(JsonObject)、可以是一个数组(JsonArray)、可以是一个Java的基本类型(JsonPrimitive)、当然也可以为null(JsonNull);JsonObject,JsonArray,JsonPrimitive,JsonNull都是JsonElement这个抽象类的子类。JsonElement提供了一系列的方法来判断当前的JsonElement

是否是上述子类的一种:比如isJsonObject()用来判断当前的json元素是否是一个Json对象,它的实现很简单且这里巧妙地应用了Java的多态机制:

  public boolean isJsonObject() {return this instanceof JsonObject;}

同样的既然有isJsonObject()等这样的判断,该类也提供了把当前JsonElement作为上述子类的一种返回的方法:

  public JsonObject getAsJsonObject() {if (isJsonObject()) {return (JsonObject) this;}throw new IllegalStateException("Not a JSON Object: " + this);}

各个JsonElement的关系可以用如下图表示:

img

JsonObject对象可以看成 name/values的集合,而这写values就是一个个JsonElement,他们的结构可以用如下图表示:

img

以上图片来源见文章底部的参考资料!

JsonPrimitive:

​ JsonElement的子类,该类对Java的基本类型及其对应的对象类进行了封装,并通过setValue方法为value赋值

  private static final Class<?>[] PRIMITIVE_TYPES = { int.class, long.class, short.class,float.class, double.class, byte.class, boolean.class, char.class, Integer.class, Long.class,Short.class, Float.class, Double.class, Byte.class, Boolean.class, Character.class };private Object value;

需要注意的是对于Character类型的json元素需要特殊处理:

void setValue(Object primitive) {if (primitive instanceof Character) {// convert characters to strings since in JSON, characters are represented as a single// character stringchar c = ((Character) primitive).charValue();this.value = String.valueOf(c);} else {$Gson$Preconditions.checkArgument(primitive instanceof Number|| isPrimitiveOrString(primitive));this.value = primitive;}}

同时对于传入的其他json类型通过checkArgumeng进行过滤,如果不是是Number或者String和 PRIMITIVE_TYPES里的一种的话,就会抛出异常。

private static boolean isPrimitiveOrString(Object target) {if (target instanceof String) {return true;}//在这里是Java class的一个简单应用Class<?> classOfPrimitive = target.getClass();for (Class<?> standardPrimitive : PRIMITIVE_TYPES) {//isAssingableFrom方法的作用是判断classsOfPrimitive是否可以转换为standardPrimitive类型if (standardPrimitive.isAssignableFrom(classOfPrimitive)) {return true;}}return false;}

同样类似JsonElement,该类也提供了判断某一个json元素是否是某一类型的判断和把某一json元素作为某一类型返回的方法:

  public boolean isNumber() {return value instanceof Number;}@Overridepublic Number getAsNumber() {return value instanceof String ? new LazilyParsedNumber((String) value) : (Number) value;}

对于Java几个基本类型用JsonPrimitive类进行了封装, 还遗漏了一个null的json元素,Gson也对它进行了单独的处理,就是JsonNull:

JsonNull:

该类没什么可说的,为不可变类。当然在json中所有的JsonNullObject 调用equals方法判断的话都是相等的。

JsonArray:

Json的数组包含的其实也是一个个Json串。所以不难猜出JsonArray中用一个集合类源码中用List来添加json数组中的每个元素。(详见源码,很简单)

JsonObject:

json对象类,包含了键值对,键是字符串类型,它的值是一个JsonElement。用 LinkedTreeMap<String, JsonElement> members来保存。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554663.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光功率 博科交换机_如何将交换机40G QSFP+与10G SFP+端口互连?

随着40G以太网的到来&#xff0c;许多企业用户开始充分利用当前的10G网络设备升级到40G网络&#xff0c;具体来说也就是如何将带有QSFP端口的40G交换机与现有带SFP端口的10G设备(交换机和服务器)搭配使用的问题。在本篇文章中&#xff0c;易天光通信(ETU-LINK)将分享三种常见的…

Gson使用Gson工具类GsonUtils(项目中要求不要使用Fastjson,原因:Fastjson存在安全漏洞)

一、概述 Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛&#xff0c;所以非常有必要对其进行系统的学习。 json是一种数据格式&#xff0c;确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。 目前大多数的网络通讯格式已经从…

keil 函数最多可以传几个参数_007 函数进阶,来做一次比较正式的作业

这节课开始之前&#xff0c;先来解决一个小问题。最近这两节课&#xff0c;有人对缩进的规则不太理解&#xff0c;这里解释一下。如上图所示&#xff0c;相同的缩进代表同一个代码块&#xff0c;即同一个顺序执行代码段落。如果代码缩进减少&#xff0c;则说明当前代码块结束&a…

信号回勾产生的原因_燃气减压阀振动的原因及处理方案

燃气减压阀是一种自动降低管路工作压力的专门装置&#xff0c;作用是在给定减压范围后&#xff0c;可以将较高压力的介质减到给定压力。它可将阀前管路较高的液气体压力减少至阀后管路所需的水平。燃气减压阀是各装置广泛使用的仪表之一&#xff0c;它准确正常地工作对保证工艺…

Java判断Bigdecimal类型是否等于0的方法

1.我之前用来判断Bigdecimal类型是否等于0的方法 b.equals(BigDecimal.ZERO); 用equals方法和BigDecimal.ZERO进行比较。 2.上面方法存在的问题 有一天&#xff0c;调用这个这句代码的时候&#xff0c;传入的确实是0&#xff0c;但却返回false 查看源代码发现&#xff1a;…

c++ _mkdir无法创建文件夹_Python脚本4:根据txt文本,批量创建文件夹

背景&#xff1a;深度学习图像分类的时候&#xff0c;有许多的标签类。1000个标签就需要创建1000个文件夹&#xff0c;文件夹里面放入对应的图像。不可能一个一个右击创建文件夹&#xff0c;所以有了今天的脚本。根据txt文本每一行的类别&#xff0c;创建文件名为类别的文件夹。…

grep -e命令详解_grep中的正则表达式

grep是Linux中用于处理文件的工具之一。grep搜索输入文件&#xff0c;查找与正则表达式匹配的行&#xff0c;并将每个匹配的行标准输出。正则表达式是匹配一组字符串的模式。模式由操作符、构造文字字符和具有特殊意义的元字符组成。grep支持三种正则表达式语法:Basic、Extende…

幼儿课外活动游戏_泰国清迈大小学校介绍 --【Little Star小星星幼儿园】

细数清迈的大小学校&#xff0c;主要分为国际学校和双语学校.一般国际学校的课程设置为10%的泰语&#xff0c;90%的英语&#xff0c;一些中文国际学校设置为20%-30%中文。国际学校可按照学制区分&#xff0c;美制、英制、德制、IB、新加坡等一系列课程。双语学校则为40%的泰语&…

Java8 Stream集合的筛选、归约、分组、聚合详解+案例

文章目录1 Stream概述2 Stream的创建3 Stream的使用案例使用的员工类3.1 遍历/匹配&#xff08;foreach/find/match&#xff09;3.2 筛选&#xff08;filter&#xff09;3.3 聚合&#xff08;max/min/count)3.4 映射(map/flatMap)3.5 归约(reduce)3.6 收集(collect)3.6.1 归集(…

liunx宝塔配置https_宝塔面板安装教程

宝塔面板安装教程原创 计科青年 今天首先登陆阿里云官网登陆你买的阿里云服务器打开服务器控制台&#xff0c;点击购买的服务器&#xff0c;点击实例&#xff0c;就可以看见自己的公网IP。1.下载Xshell6远程连接软件&#xff0c;打开软件点击文件新建这里推荐大家使用Xshell6进…

java用户角色权限管理 只显示姓_快递物流管理系统SSM,JQUERYEASYUI,MYSQL

快递物流管理系统(SSM,JQUERY-EASYUI,MYSQL)(毕业论文27564字,共78页,程序代码,MySQL数据库) 全套项目下载地址: http://woc.xin/WQBgtE【运行环境】 Eclipse, IDEA JDK1.7(JDK1.8) Tomcat7(Tomcat8)【技术栈】 JAVA, JSP, SSM, JQUERY, JQUERY EASYUI, MYSQL, HTML, CSS, JAVA…

判刑后再上诉会改判吗_近视眼手术后还会再近视反弹吗?有哪些后遗症,温州眼科专家告诉你...

经过几代的更新发展&#xff0c;近视眼手术的技术已相当成熟。激光近视手术受到越来越多近视患者的青睐&#xff0c;飞秒激光近视手术俨然成为目前矫正近视的新潮流。很多人以为&#xff0c;有了近视手术后便不需要注意近视的防控。轻松摘镜的背后&#xff0c;是彻夜狂欢&#…

dev c++调试怎么看变量的值_利用GDB调试 MSQL

原创 张政俊 老叶茶馆来自专辑MySQL修行作者&#xff1a;张政俊就职于中欧基金&#xff0c;知数堂粉丝&#xff0c;数据库爱好者&#xff0c;熟悉RDBMS、nosql、new sql等各类数据库。啃完Oreilly的《高性能mysql》、姜老师的《MySQL技术内幕》&#xff0c;再加上个2,3年的实战…

案例 自动办公_办公自动化案例教程(双色)(含微课)

办公自动化案例教程(双色)(含微课)ISBN:978-7-5165-1852-6作者&#xff1a;贺鑫 彭卫华 李胜华定价&#xff1a;48.00元出版社&#xff1a;航空工业出版社适用层次&#xff1a;通用出版日期&#xff1a;2020-05-01项目一 使用Word制作常用公文项目描述学习要点任务一 制作行政…

柱形图无数据可选中_Excel – 如何制作出上下层排列的柱形图?

如何将同一个数据表中的不同数据列排列成上下两层柱形图&#xff1f;案例&#xff1a;将下图 1 的数据表制作成柱形图&#xff0c;要求将销量和利润的柱形分成两个图表上下排列。效果如下图 2 所示。解决方案&#xff1a;1. 选中整个数据表区域 --> 选择菜单栏的“插入”--&…

html画布360图案填充_在Photoshop中创建带有图案的抽象设计

效果图知识点&#xff1a;应用选区工具结合图层混合模式和混合选项&#xff0c;创造出唯美的抽象类画册 效果设计本身由一系列同心圆组成&#xff0c;每组的大小各不相同。每个圆都有6个核心色板的底色&#xff0c;然后渐变和图案填充会增加细节和深度。我们需要创建图案填充。…

emd实现信息隐藏_EMD算法原理与实现

欢迎关注我们&#xff0c;选择加"星标"或“置顶”更多技术&#xff0c;第一时间送达SSVEP信号中含有自发脑电和大量外界干扰信号&#xff0c;属于典型的非线性非平稳信号。传统的滤波方法通常不满足对非线性非平稳分析的条件&#xff0c;1998年黄鄂提出希尔伯特黄变换…

转为yaml python_python 如何使用HttpRunner做接口自动化测试

作者&#xff1a;星安果 来源&#xff1a;AirPython1. 前言原始测试金子塔包含 3 层&#xff0c;分别是&#xff1a;UI 自动化测试、接口服务测试、单元测试其中&#xff0c;单元测试是对软件的最小可测试单元进行检查和验证&#xff0c;也是产生效率最大的一项测试接口服务测试…

eq值 推荐算法_利用 SVD 实现协同过滤推荐算法

奇异值分解(Singular Value Decomposition&#xff0c;以下简称SVD)是在机器学习领域广泛应用的算法&#xff0c;它不光可以用于降维算法中的特征分解&#xff0c;还可以用于推荐系统&#xff0c;以及自然语言处理等领域。优点&#xff1a;简化数据&#xff0c;去除噪声&#x…

打开数据库_打开这份指南,数据库运维也能优雅、简单!

对于常规数据库的运维监控来说&#xff0c;如何能够快速简洁的发现问题&#xff0c;直达问题本质并解决常见问题&#xff0c;是 Bethune 的安身立命之本。简约&#xff0c;优雅&#xff0c;专业&#xff0c;直抵本心&#xff0c;这是用户对 Bethune 的评价。Bethune X 功能强大…