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

在这里插入图片描述

一、概述
Gson是google提供的用来操作json数据的一个非常好用的类库。其使用范围非常的广泛,所以非常有必要对其进行系统的学习。
json是一种数据格式,确切的说是一种文本数据格式。其在网络通讯过程中的作用非常的明显。
目前大多数的网络通讯格式已经从xml替换为json格式。
其提供了序列化和反序列化的功能。在我们进行网络开发的过程中通常会把参数封装成json格式传给后台,后台解析后的返回结果也会封装成json格式返回给调用者。

1.如何创建一个Gson对象

	/*** 创建Gson对象的两种形式*/private void createGsonObject() {//第一种方式Gson gson = new Gson();//第二种方式Gson gson1 = new GsonBuilder().create();//方式二除了可以创建一个Gson对象以外还可以进行多项配置,例如,设置日期的格式化
//       例如: new GsonBuilder().setDateFormat("yyyy-MM-dd");}

2.如何创建一个JsonObject

/*** 如何创建一个json对象*/private void createJsonObject() {JsonObject jsonObject = new JsonObject();jsonObject.addProperty("id", "1");//给jsonObject创建一个id属性值为1jsonObject.addProperty("bookName", "《深入Java虚拟机》");jsonObject.addProperty("bookPrice", 36.8);jsonObject.addProperty("bookColor", "红色");//打印Json字符串System.out.println(jsonObject.toString());//给JsonObject添加对象JsonObject jsonObject1 = new JsonObject();jsonObject1.addProperty("chapterId", "1");jsonObject1.addProperty("chapterName", "第一章");//给JsonObject添加实体对象jsonObject.add("chapter", jsonObject1);System.out.println(jsonObject.toString());/*** 输出结果:* {"id":"1","bookName":"《深入Java虚拟机》","bookPrice":36.8,"bookColor":"红色"}* {"id":"1","bookName":"《深入Java虚拟机》","bookPrice":36.8,"bookColor":"红色","chapter":{"chapterId":"1","chapterName":"第一章"}}*/}

注:这里的JsonObject表示我们一样可以创建一个json对象;但是我们后面一般使用的是java对象跟json字符串的转换,可以用通过创建好的gson对象来操作。

3.数组的序列化与反序列化

	/*** 根据一个json创建一个数组*/private void createJsonArray() {//把数组转换为Json字符串String[] str = new String[]{"《深入Java虚拟机》", "《Android插件编程》", "《OpenCV全解》"};Gson gson = new Gson();String jsonStr = gson.toJson(str);//先创建一个Json字符串System.out.println(jsonStr);//输出//把Json字符串转换为Json数组String[] strArray = gson.fromJson(jsonStr, String[].class);for (String s : strArray) {System.out.println(s);}/*** 输出结果:* ["《深入Java虚拟机》","《Android插件编程》","《OpenCV全解》"]* 《深入Java虚拟机》* 《Android插件编程》* 《OpenCV全解》*/}

4.List的序列化与反序列化

 	/*** 根据一个json创建一个list*/private void createJsonToList() {//将list集合转换为json字符串List<Book> books = new ArrayList<>();books.add(new Book("1", "《深入Java虚拟机》"));books.add(new Book("2", "《OpenCV进阶》"));books.add(new Book("3", "《深入Android源代码》"));Gson gson = new Gson();String jsonListStr = gson.toJson(books);System.out.println(jsonListStr);//将json字符串转换为list集合//获取泛型的类型Type type = new TypeToken<List<Book>>() {}.getType();//使用gson将字符串转换为泛型集合,即List<Book>List<Book> books1 = gson.fromJson(jsonListStr, type);for (Book book : books1) {System.out.println(book.getName());}/*** 输出结果:* [{"id":"1","name":"《深入Java虚拟机》"},{"id":"2","name":"《OpenCV进阶》"},{"id":"3","name":"《深入Android源代码》"}]* 《深入Java虚拟机》* 《OpenCV进阶》* 《深入Android源代码》*/}

注:

//获取泛型的类型
Type type = new TypeToken<List<Book>>() {}.getType();*

5.序列化与反序列化综合例子(基于Book对象)

public class Book {public Book(){}private String id;/*** 加上@SerializedName注解后服务端api返回bookName、Name、bn时,客户端都能够拿到正确的值给name属性。*/@SerializedName(value = "bookName",alternate = {"Name","bn"})private String name;public Book(String id, String name) {this.id = id;this.name = name;}
}/*** json的序列化与反序列化* 使用toJson实现序列化,使用fromJson实现反序列化*/private void jsonSeriaReSeria() {Gson gson = new Gson();Book book = new Book("1", "《深入Java虚拟机》");//将book类序列化成字符串String bookStr = gson.toJson(book);System.out.println(bookStr);//将bookStr反序列化成为Book类Book b = gson.fromJson(bookStr, Book.class);System.out.println(b.getName());}

6.如何为属性做兼容性处理(重命名、预设名称等)

 	/*** 如何给json属性重命名* 假设我们有这样一个需求:由于接口改版,从服务端返回的api中的book字段的name属性,变为了bookName。如果我们* 仍然用name进行解析,则接不到bookName的值,而由于服务端没有返回name,则解析后name=null。如果要考虑到兼容性那么我们的的Book类的属性就* 需要做一下兼容性的处理。* 使用@SerializedName可以给属性重命名。用@SerializedName的alternate属性给Book的属性做扩展*/private void reNameProperty() {String bookJson = "{\"id\":\"1\",\"bookName\":\"《深入Java虚拟机》\"}";Gson gson = new Gson();Book book = gson.fromJson(bookJson, Book.class);System.out.println(book.getName());}

注:@SerializedName(value = “bookName”,alternate = {“Name”,“bn”})表示在反序列化时候可以使用bookName,Name,bn都可以被识别到,set到Book中的name属性;相应的在序列化的时候,name属性会被序列化为bookName字符串;

7.GsonBuilder的一些基础配置

	/*** 对GsonBuilder一些属性介绍*/private void gsonBuilderProperty() {Gson gson = new GsonBuilder().serializeNulls()//默认情况下如果某一个属性为null,那么此属性不会参与序列化和反序列化的过程,加上此属性后会参与序列化和反序列化的过程.setPrettyPrinting()//格式化json字符串的输出,默认情况下是输出一行,经过这个属性设置后会格式化输出,即有缩进的输出.setDateFormat("yyyy-MM-dd HH:mm:ss")//对时间进行格式化.create();}

8.TypeAdapter使用方法介绍

	/*** typeAdapter的使用方法* TypeAdapter是一个泛型抽象类,用于接管某种类型的序列化和反序列化的过程* 它包含两个抽象方法write和read,分别用于自定义的序列化和反序列化的过程*/private void useTypeAdapter() {Gson gson = new GsonBuilder().registerTypeAdapter(Book.class,new BookTypeAdapter()).create();Book book = new Book("1","深入Java虚拟机");System.out.println(gson.toJson(book));String bookJson = "{\"Id\":\"1\",\"Name\":\"《深入Java虚拟机》\"}";Book book1 = gson.fromJson(bookJson,Book.class);System.out.println(gson.toJson(book1));}以下是BookTypeAdapter的代码介绍package com.yw.gsonlib;import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;import java.io.IOException;public class BookTypeAdapter extends TypeAdapter<Book> {/*** 序列化接口** @param jsonWriter* @param book* @throws IOException*/@Overridepublic void write(JsonWriter jsonWriter, Book book) throws IOException {//流式序列化对象开始jsonWriter.beginObject();//将Json的key值都指定为首字母大写jsonWriter.name("Id").value(book.getId());jsonWriter.name("Name").value(book.getName());//流式序列化对象结束jsonWriter.endObject();}/*** 反序列化接口** @param jsonReader* @return* @throws IOException*/@Overridepublic Book read(JsonReader jsonReader) throws IOException {Book book = new Book();//流式反序列化开始jsonReader.beginObject();while (jsonReader.hasNext()) {switch (jsonReader.nextName()) {case "id":case "Id":book.setId(jsonReader.nextString());break;case "name":case "Name":book.setName(jsonReader.nextString());break;}}//流式反序列化结束jsonReader.endObject();return book;}
}

Gson 工具类

package com.utils;import com.google.gson.*;
import com.google.gson.reflect.TypeToken;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class GsonUtils {//不用创建对象,直接使用Gson.就可以调用方法private static Gson gson = null;//判断gson对象是否存在了,不存在则创建对象static {if (gson == null) {//gson = new Gson();// 当使用GsonBuilder方式时属性为空的时候输出来的json字符串是有键值key的,显示形式是"key":null,而直接new出来的就没有"key":null的gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();}}//无参的私有构造方法private GsonUtils() {}/*** 将对象转成json格式** @param object* @return String*/public static String GsonString(Object object) {String gsonString = null;if (gson != null) {gsonString = gson.toJson(object);}return gsonString;}/*** 将json转成特定的cls的对象** @param gsonString* @return*/public static <T> T GsonToBean(String gsonString, Class<T> cls) {T t = null;if (gson != null) {//传入json对象和对象类型,将json转成对象t = gson.fromJson(gsonString, cls);}return t;}/*** json字符串转成list** @param gsonString* @return*/public static <T> List<T> GsonToList(String gsonString, Class<T> cls) {List<T> list = null;if (gson != null) {//根据泛型返回解析指定的类型,TypeToken<List<T>>{}.getType()获取返回类型list = gson.fromJson(gsonString, new TypeToken<List<T>>() {}.getType());}return list;}/*** json字符串转成list** @param json* @return*/public static <T> List<T> jsonToList(String json, Class<T> cls) {ArrayList<T> mList = new ArrayList<T>();JsonArray array = new JsonParser().parse(json).getAsJsonArray();for (final JsonElement elem : array) {mList.add(gson.fromJson(elem, cls));}return mList;}/*** json字符串转成数组** @param json* @return*/public static Object[] json2ObjectArray(String json, Class cls) {TypeToken<?> array = TypeToken.getArray(cls);Gson gson = new Gson();Object[] objects = gson.fromJson(json, array.getType());return objects;}/*** json字符串转成list中有map的** @param gsonString* @return*/public static <T> List<Map<String, T>> GsonToListMaps(String gsonString) {List<Map<String, T>> list = null;if (gson != null) {list = gson.fromJson(gsonString,new TypeToken<List<Map<String, T>>>() {}.getType());}return list;}/*** json字符串转成map的** @param gsonString* @return*/public static <T> Map<String, T> GsonToMaps(String gsonString) {Map<String, T> map = null;if (gson != null) {map = gson.fromJson(gsonString, new TypeToken<Map<String, T>>() {}.getType());}return map;}
}

注意:

项目中要求不要使用Fastjson,原因:Fastjson存在安全漏洞
经查阅资料:Fastjson≤1.2.80的版本存在安全漏洞;

Gson工具类

import com.google.gson.*;
import com.google.gson.reflect.TypeToken;
import lombok.SneakyThrows;import java.lang.reflect.Type;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Objects;public class GsonUtils {private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");private static final JsonSerializer<LocalDateTime> dateTimeSerializer= (obj, type, ctx) -> new JsonPrimitive(dateTimeFormatter.format(obj));private static final JsonSerializer<LocalDate> dateSerializer= (obj, type, ctx) -> new JsonPrimitive(dateFormatter.format(obj));private static final JsonSerializer<LocalTime> timeSerializer= (obj, type, ctx) -> new JsonPrimitive(timeFormatter.format(obj));private static final JsonDeserializer<LocalDateTime> dateTimeDeserializer= (json, type, ctx) -> LocalDateTime.parse(json.getAsJsonPrimitive().getAsString(), dateTimeFormatter);private static final JsonDeserializer<LocalDate> dateDeserializer= (json, type, ctx) -> LocalDate.parse(json.getAsJsonPrimitive().getAsString(), dateFormatter);private static final JsonDeserializer<LocalTime> timeDeserializer= (json, type, ctx) -> LocalTime.parse(json.getAsJsonPrimitive().getAsString(), timeFormatter);private static final Gson gson;static {GsonBuilder builder = new GsonBuilder();builder.disableHtmlEscaping();builder.enableComplexMapKeySerialization();// builder.excludeFieldsWithoutExposeAnnotation();builder.setDateFormat("yyyy-MM-dd HH:mm:ss");builder.registerTypeAdapter(LocalDateTime.class, dateTimeSerializer);builder.registerTypeAdapter(LocalDate.class, dateSerializer);builder.registerTypeAdapter(LocalTime.class, timeSerializer);builder.registerTypeAdapter(LocalDateTime.class, dateTimeDeserializer);builder.registerTypeAdapter(LocalDate.class, dateDeserializer);builder.registerTypeAdapter(LocalTime.class, timeDeserializer);gson = builder.create();}public static Type makeJavaType(Type rawType, Type... typeArguments) {return TypeToken.getParameterized(rawType, typeArguments).getType();}public static String toString(Object value) {if (Objects.isNull(value)) {return null;}if (value instanceof String) {return (String) value;}return toJSONString(value);}public static String toJSONString(Object value) {return gson.toJson(value);}public static String toPrettyString(Object value) {return gson.newBuilder().setPrettyPrinting().create().toJson(value);}public static JsonElement fromJavaObject(Object value) {JsonElement result = null;if (Objects.nonNull(value) && (value instanceof String)) {result = parseObject((String) value);} else {result = gson.toJsonTree(value);}return result;}@SneakyThrowspublic static JsonElement parseObject(String content) {return JsonParser.parseString(content);}public static JsonElement getJsonElement(JsonObject node, String name) {return node.get(name);}public static JsonElement getJsonElement(JsonArray node, int index) {return node.get(index);}@SneakyThrowspublic static <T> T toJavaObject(JsonElement node, Class<T> clazz) {return gson.fromJson(node, clazz);}@SneakyThrowspublic static <T> T toJavaObject(JsonElement node, Type type) {return gson.fromJson(node, type);}public static <T> T toJavaObject(JsonElement node, TypeToken<?> typeToken) {return toJavaObject(node, typeToken.getType());}public static <E> List<E> toJavaList(JsonElement node, Class<E> clazz) {return toJavaObject(node, makeJavaType(List.class, clazz));}public static List<Object> toJavaList(JsonElement node) {return toJavaObject(node, new TypeToken<List<Object>>(){}.getType());}public static <V> Map<String, V> toJavaMap(JsonElement node, Class<V> clazz) {return toJavaObject(node, makeJavaType(Map.class, String.class, clazz));}public static Map<String, Object> toJavaMap(JsonElement node) {return toJavaObject(node, new TypeToken<Map<String, Object>>(){}.getType());}@SneakyThrowspublic static <T> T toJavaObject(String content, Class<T> clazz) {return gson.fromJson(content, clazz);}@SneakyThrowspublic static <T> T toJavaObject(String content, Type type) {return gson.fromJson(content, type);}public static <T> T toJavaObject(String content, TypeToken<?> typeToken) {return toJavaObject(content, typeToken.getType());}public static <E> List<E> toJavaList(String content, Class<E> clazz) {return toJavaObject(content, makeJavaType(List.class, clazz));}public static List<Object> toJavaList(String content) {return toJavaObject(content, new TypeToken<List<Object>>(){}.getType());}public static <V> Map<String, V> toJavaMap(String content, Class<V> clazz) {return toJavaObject(content, makeJavaType(Map.class, String.class, clazz));}public static Map<String, Object> toJavaMap(String content) {return toJavaObject(content, new TypeToken<Map<String, Object>>(){}.getType());}}

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

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

相关文章

浅析怎样提升win7 旗舰版系统显示质量

今天小编给大家浅析怎样提升win7 旗舰版系统显示质量&#xff0c;大家一起来了解下吧&#xff0c;具体如下&#xff1a; 一、打开的程序或窗口的数量尽量减少 当你打开的程序越多&#xff0c;Windows 所需的系统资源也就越多。请将当前没有使用的程序关闭&#xff0c;或缩小窗…

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

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

Win7休眠后唤醒出现黑屏的解决办法

进入睡眠状态可很好地节约电源和延长硬件的使用寿命&#xff0c;很多用户的电脑进入睡眠状态后&#xff0c;唤醒无法正常进入屏幕&#xff0c;而是变成黑屏的故障&#xff0c;怎么回事?其实出现这种情况并非什么系统故障问题&#xff0c;下面小编给大家分享Win7休眠后唤醒出现…

Map按照Value值进行排序的实现

Map按照Value值进行排序的实现 map.entrySet().stream().sorted(Comparator<? super T> comparator)给定一个map&#xff0c;存储一个nums数组中每一个数字存储的次数&#xff0c;最后将这个map按照value值&#xff0c;即出现的次数进行排序 第一种方式&#xff1a;返…

传授电脑蓝屏开不了机怎么办

电脑是现代社会不可缺少的重要工具&#xff0c;不仅可以帮助处理复杂的数据&#xff0c;还可以辅助教学&#xff0c;设计&#xff0c;聊天娱乐。下面&#xff0c;我就给大家介绍一下电脑蓝屏开不了机的解决方法&#xff0c;有需要就引起来了解一下吧 大家在使用电脑的时候有没…

华为核心交换如何配置源地址转换_华为三层交换机配置步骤解释资料全

word格式文档专业整理华为三层交换机配置步骤1.给交换机划分VLANVlan是虚拟局域网的意思&#xff0c;它相当于一个局域网工作组。“vlan几”可以理解成编号为几的vlan&#xff0c;比如vlan 2就是编号为2的vlan&#xff0c;只是一个编号而已&#xff0c;并不是说vlan 2的网段一定…

关于Gson的TypeToken

文章目录引言Type是什么获取类型的困惑自定义TypeToken解决问题总结引言 Gson在Json解析中使用广泛, 常用的数据类型都可以解析, 特殊的可以自定义Adapter解析. 在解析大量具有某些相同结构的数据上,我们总想复用已有的类型, 为了复用通常可以使用继承和泛型. 比如服务端返回的…

如何用U盘之家U盘启动盘制作工具实现U盘装系统

若你有一个U盘&#xff0c;本文就带你实现如何来U盘装系统&#xff0c;完全丢掉你的光驱&#xff0c;虽然这个工具比较老了&#xff0c;但教程一样的适用于现在的电脑。 需要的环境&#xff1a; 本文制作出来的引导方式为USB-HDD或USB-ZIP&#xff0c;无需量产&#xff0c;U盘…

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

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

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

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

手把手教你u盘打不开解决教程

u盘打不开怎么办&#xff0c;其实不论说是在工作上&#xff0c;还是学习当中所遇到的问题&#xff0c;都有着与相对应的原因以及相对应的解决方法。那么究竟要怎样才能够修复好u盘呢?想知道?那么就赶紧往下瞧~ 我们在使用u盘时候&#xff0c;经常都会遇上u盘插入电脑打不开的…

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

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

Java8 Stream Collectors groupingBy 和 mapping 配合使用 Collectors.summingInt()分组求和

介绍 Java8 Stream 中 Collectors.groupingBy() 的文章已经很多了&#xff0c;这里想记录一下该方法和 Collectors.mapping() 方法配合使用的一些案例。 一、准备 Student 实体类。 Data AllArgsConstructor public class Student {private String name;private int age;pri…

acer电脑设置u盘启动方法

你们知道acer进入U盘启动系统吗?现在都是流行u盘安装系统了&#xff0c;u盘安装系统都是通过设置u盘启动盘来安装&#xff0c;这就要在BIOS里设置从U盘启动&#xff0c;我知道你们大部分人都知道如何设置&#xff0c;现在就告诉你们acer电脑设置u盘启动方法吧。 一;用快捷热键…

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

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

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

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

华硕主板如何u盘启动电脑

首先将制作好的U盘启动盘插入到电脑主机USB插口&#xff0c;然后开机&#xff0c;开启电脑后当看到开机画面的时候&#xff0c;连续按下键盘上的“F8”键&#xff0c;将会进入到一个启动项顺序选择的窗口。 进入后的光标默认选择的选项是第一个“硬盘启动”&#xff0c;使用键…

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 归集(…

超人汉考克里的机器人_电影《全民超人汉考克》无删减BD/HD高清完整版在线免费观看-新视觉影视...

1.请问哪个平台可以免费在线观看动作片《全民超人汉考克》&#xff1f;电影天堂网网友&#xff1a;《全民超人汉考克》免费在线观看地址2.《全民超人汉考克》是什么时候上映/什么时候开播的&#xff1f;天堂影院网友&#xff1a;2008年&#xff0c;详细日期可以去百度百科查一查…

xp电脑怎么进入bios

按下电源键开机或重新启动计算机&#xff0c;多数电脑会出现品牌LOGO界面&#xff0c;并且提示进入BIOS的按键&#xff0c;进入BIOS按键为DEL&#xff0c;打开Boot Menu启 按下键盘上的DEL键&#xff0c;这时候电脑就会进入BIOS设置主界面&#xff0c;通过↑↓←→方向键选择设…