Java中Json字符串和Java对象的互转
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。
JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使 JSON 成为理想的数据交换语言。几乎所有的APP、应用、网站、程序都离不开 JSON。
常见的 Json 解析器:Gson,Fastjson,Json-lib,Jackson
文章目录
- 一、Java中Json字符串和Java对象的互转概述
- 1、关于 Json
- 2、Json 解析器
- 二、使用 Gson 完成 Json 字符串和 Java 对象的互转
- 1、Gson 介绍
- 2、Gson 引入
- 3、Gson 主要类介绍
- 4、Gson Demo
- 5、对象与 Json 互转
- 6、直接操作 Json 以及一些 Json 的工具
- 7、gsonUtil 工具类
- 三、使用 FastJson 完成 Json 字符串和 Java 对象的互转
- 1、FastJson 介绍
- 2、FastJson 引入
- 3、null 值对应 key 的序列化
- 4、FastJson Demo
- 5、对象与 Json 互转
一、Java中Json字符串和Java对象的互转概述
1、关于 Json
Json(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。Json 是目前主流的前后端数据传输方式。
Json 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。 这些特性使 Json 成为理想的数据交换语言。几乎所有的APP、应用、网站、程序都离不开 Json。
2、Json 解析器
常见的 Json 解析器:Gson,FastJson,Json-lib,Jackson
- Gson(又称Google Gson)是 Google 公司发布的一个开放源代码的 Java 库。特点是快速高效,代码量少、简洁;
- FastJson 是一个Java语言编写的高性能的 Json 处理器,由阿里巴巴公司开发。无依赖,不需要例外额外的 Jar,能够直接跑在 Jdk 上;
- Json-lib 最开始的也是应用最广泛的 Json 解析工具,Json-lib 不好的地方确实是依赖于很多第三方包;
- 相比 Json-lib 框架,Jackson 所依赖的 Jar 包较少,简单易用并且性能也要相对高些。而且 Jackson 社区相对比较活跃,更新速度也比较快。Jackson 对于复杂类型的 Json 转换Bean 会出现问题,一些集合 Map,List 的转换出现问题。
序列化性能:FastJson > Jackson > Gson > Jsonlib
反序列化性能:Gson > Jackson > FastJson > Jsonlib
二、使用 Gson 完成 Json 字符串和 Java 对象的互转
1、Gson 介绍
Google 的 Gson 是目前功能最全的 Json 解析神器,Gson 当初是为因应 Google 公司内部需求而由 Google 自行研发,但自从在2008年五月公开发布第一版后已被许多公司或用户应用。
Gson 的应用主要为 toJson 与 fromJson 两个转换函数,无依赖,不需要例外额外的 Jar,能够直接跑在 Jdk 上。而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将Json 字符串成功转换成相对应的对象。类里面只要有 get 和 set 方法,Gson 完全可以将复杂类型的 Json 到 Bean 或 Bean 到 Json 的转换,是 Json 解析的神器。
Ps:尽管 Gson 在功能上面无可挑剔,但是性能上面比 FastJson 有所差距。
2、Gson 引入
Maven 依赖引入:
<!--gson--><dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.10.1</version></dependency>
3、Gson 主要类介绍
Gson 主要类:
- Gson 类:解析 Json 的最基础的工具类
- JsonParser 类:解析器来解析 Json 到 JsonElements 的解析树
- JsonElement 类:一个类代表的 Json 元素
- JsonObject 类:Json 对象类型
- JsonArray 类:JsonObject 数组
- TypeToken 类:用于创建 type,比如泛型 List<?>
4、Gson Demo
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;public class GsonTestClass {public static void main(String[] args) {User user = new User();user.setId(1);user.setName("栗筝i");Gson g = new GsonBuilder().create();String str = g.toJson(user);System.out.println(str);}
}
Ps:默认是不序列化 null 值对应的 key 的,若是想序列化 null 值对应的 key,只需要将以上创建代码改成以下代码就行:
Gson g = new GsonBuilder().serializeNulls().create();
5、对象与 Json 互转
# bean 转换 Json
Gson gson = new Gson();
// obj 是对象
String json = gson.toJson(obj);
Ps:当我们需要把定义类的成员变量属性名和返回的 Json 中的格式名称隔离开,可以采用 @SerializedName 注解标记!!
# Json 转换 bean
Gson gson = new Gson();
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
Book book = gson.fromJson(json, Book.class);
# Json 转换复杂的 bean,比如 List,Set
Gson gson = new Gson();
String json = "[{\"id\":\"1\",\"name\":\"栗筝i\"},{\"id\":\"2\",\"name\":\"栗筝ii\"}]";
// 将 Json 转换成 List
List list = gson.fromJson(json, new TypeToken<LIST>() {}.getType());
// 将 Json 转换成 Set
Set set = gson.fromJson(json, new TypeToken<SET>() {}.getType());
6、直接操作 Json 以及一些 Json 的工具
# 格式化 Json:
String json = "[{\"id\":\"1\",\"name\":\"栗筝i\"},{\"id\":\"2\",\"name\":\"栗筝ii\"}]";
Gson gson = new GsonBuilder().setPrettyPrinting().create();
JsonParser jp = new JsonParser();
JsonElement je = jp.parse(json);
json = gson.toJson(je);
# 判断字符串是否是 Json(通过捕捉的异常来判断是否是 Json)
String json = "[{\"id\":\"1\",\"name\":\"栗筝i\"},{\"id\":\"2\",\"name\":\"栗筝ii\"}]";
boolean jsonFlag;
try {new JsonParser().parse(str).getAsJsonObject();jsonFlag = true;
} catch (Exception e) {jsonFlag = false;
}
# 从 Json 串中获取属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'id';
String propertyValue = "";
try {JsonParser jsonParser = new JsonParser();JsonElement element = jsonParser.parse(json);JsonObject jsonObj = element.getAsJsonObject();propertyValue = jsonObj.get(propertyName).toString();
} catch (Exception e) {propertyValue = null;
}
# 除去 Json 中的某个属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'id';
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
json = jsonObj.toString();
# 向 Json 中添加属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'age';
Object propertyValue = "26";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();
# 修改 Json 中的属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'name';
Object propertyValue = "栗筝ii";
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
jsonObj.remove(propertyName);
jsonObj.addProperty(propertyName, new Gson().toJson(propertyValue));
json = jsonObj.toString();
# 判断 Json 中是否有属性
String json = "{\"id\":\"1\",\"name\":\"栗筝i\"}";
String propertyName = 'name';
boolean isContains = false ;
JsonParser jsonParser = new JsonParser();
JsonElement element = jsonParser.parse(json);
JsonObject jsonObj = element.getAsJsonObject();
isContains = jsonObj.has(propertyName);
7、gsonUtil 工具类
import com.dechnic.common.anno.gson.Exclude;
import com.dechnic.common.po.ObjectTypeAdapter;
import com.google.gson.ExclusionStrategy;
import com.google.gson.FieldAttributes;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class GsonUtll {private static Gson gson;static {ExclusionStrategy strategy = new ExclusionStrategy() {@Overridepublic boolean shouldSkipField(FieldAttributes f) {return f.getAnnotation(Exclude.class) !=null;}@Overridepublic boolean shouldSkipClass(Class<?> clazz) {return false;}};gson = new GsonBuilder().disableHtmlEscaping().setExclusionStrategies(strategy).registerTypeAdapter(new TypeToken<Map<String,Object>>(){}.getType(),new ObjectTypeAdapter()).serializeNulls().create();}public static Map<String,Object> jsonStr2Map(String jsonStr){return gson.fromJson(jsonStr, new TypeToken<Map<String, Object>>() {}.getType());}public static List<Map<String,Object>> jsonStr2ListMap(String jsonStr){return gson.fromJson(jsonStr, new TypeToken<List<Map<String, Object>>>() {}.getType());}public static String toJSON(Object object){return gson.toJson(object);}public static <T> List<T> json2ListBean(String result, Class<T> t){List list = gson.fromJson(result, new TypeToken<List>() {}.getType());List list2 = new ArrayList();for (Object o : list) {list2.add(json2Bean(toJSON(o),t));}return list2;}public static <T> T json2Bean(String result,Class<T>t){return gson.fromJson(result, t);}}
三、使用 FastJson 完成 Json 字符串和 Java 对象的互转
1、FastJson 介绍
Fastjson 由阿里巴巴公司开发,是一个 Java 语言编写的高性能的 Json 处理器。无依赖,不需要例外额外的 Jar,能够直接跑在 Jdk 上。
FastJson 在复杂类型的 Bean 转换 Json 上会出现一些问题,可能会出现引用的类型,导致 Json 转换出错,需要制定引用。
FastJson 采用独创的算法,将 parse 的速度提升到极致,超过所有 Json 库。
2、FastJson 引入
Maven 依赖引入:
<dependency><groupId>com.alibaba.fastjson2</groupId><artifactId>fastjson2</artifactId><version>2.0.23</version>
</dependency>
3、null 值对应 key 的序列化
FastJson 在转换 Java 对象为 Json 的时候,默认是不序列化 null 值对应的 key 的,也就是说当对象里面的属性为空的时候,在转换成 Json 时,不序列化那些为 null 值的属性
仔细看 FastJson 转换 Java 对象为 Json 的方法的入参:
public static String toJSONString(Object object, com.alibaba.fastjson2.JSONWriter.Feature... features)
可以看到 features 是一个数组 JSONWriter.Feature 则是其序列化属性:
- QuoteFieldNames———-输出 key 时是否使用双引号,默认为 true
- WriteMapNullValue——–是否输出值为 null 的字段,默认为 false
- WriteNullNumberAsZero———-数值字段如果为 null,输出为 0,而非 null
- WriteNullListAsEmpty———-List 字段如果为 null,输出为[],而非null
- WriteNullStringAsEmpty———-字符类型字段如果为 null,输出为”“,而非null
- WriteNullBooleanAsFalse———-Boolean 字段如果为 null,输出为 false,而非null
4、FastJson Demo
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;public class FastJsonTestClass {public static void main(String[] args) {User user = new User();user.setIdd(1);user.setName("栗筝i");String str = JSONObject.toJSONString(user, JSONWriter.Feature.WriteMapNullValue);System.out.println(str);}
}
Ps:当我们需要把定义类的成员变量属性名和返回的 Json 中的格式名称隔离开,可以采用 @JSONField 注解标记!!
5、对象与 Json 互转
# 对象转 Json
User user = new User();
user.setId(1);
user.setName("栗筝i");
System.out.println(JSON.toJSONString(user, JSONWriter.Feature.UseSingleQuotes));
# Json 转对象
String json = "{\"id\":1,'name':'张三'}";
User userModel = JSON.parseObject(json, User.class);
# 将 Json 解析为 JSONObject
String json = "{\"id\":1,'name':'张三'}";
JSONObject data = JSON.parseObject(json);
System.out.println(data.get("id"));
# 将 Json 解析为 JSONArray
String text = "...";
JSONArray data = JSON.parseArray(text);
相关文章:
Java中Json字符串和Java对象的互转
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。诞生于 2002 年。易于人阅读和编写。同时也易于机器解析和生成。JSON 是目前主流的前后端数据传输方式。 JSON 采用完全独立于语言的文本格式,但是也使用了类似于 C 语言家族的…...
代码随想录NO42 | 动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数
动态规划_Leetcode70. 爬楼梯 (进阶) 322. 零钱兑换 279.完全平方数70. 爬楼梯 (进阶) 在原题基础上,改为:一步一个台阶,两个台阶,三个台阶,…,直到 m个台阶…...
【C++从入门到放弃】初识C++(基础知识入门详解)
🧑💻作者: 情话0.0 📝专栏:《C从入门到放弃》 👦个人简介:一名双非编程菜鸟,在这里分享自己的编程学习笔记,欢迎大家的指正与点赞,谢谢! C基础…...
企业工程项目管理系统源码+spring cloud 系统管理+java 系统设置+二次开发
工程项目各模块及其功能点清单 一、系统管理 1、数据字典:实现对数据字典标签的增删改查操作 2、编码管理:实现对系统编码的增删改查操作 3、用户管理:管理和查看用户角色 4、菜单管理:实现对系统菜单的增删改查操…...
【GPLT 三阶题目集】L3-016 二叉搜索树的结构
二叉搜索树或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分…...
核心交换机安全多业务高性能万兆交换机
RG-S5750-24SFP/12GT交换机是锐捷网络推出的融合了高性能、高安全、多业务的新一代三层交换机。RG-S5750-24SFP/12GT 交换机能够提供灵活的介质接口,满足网络建设中不同介质的连接需要。全千兆的端口形态,加上可扩展的高密度万兆端口,提供1&a…...
Android APK 签名打包原理分析(三)【静默安装的实现方案】
背景 小编目前从事的系统定制类工作,有客户提出了,需要后台“静默安装”他们的app,也就是悄无声息的安装,而且特别强调,不可以跳出任何安装引导页面,他们的app下载完成之后,后台调用公开的android install代码,系统就后台完成安装,安装完成之后,重新打开应用就可以。…...
mulesoft MCIA 破釜沉舟备考 2023.02.14.05
mulesoft MCIA 破釜沉舟备考 2023.02.14.05 1. Refer to the exhibit.2. A Kubernetes controller automatically adds another pod replica to the resource pool in response to increased application load.3. An XA transaction Is being configured that involves a JMS c…...
结构体的三种定义方法、结构体类型名(可选标志符)什么时候可以省略
结构体的三种定义方法 一、单独定义: 先定义结构体类型,再定义变量 定义结构体的格式如下: struct 结构体名 { 若干数据项; } ; 其中,struct为关键字; 结构体名是用户定…...
cgo静态编译不能用glibc,用musl
Golang 的一个动态链接依赖问题 upx 是一个压缩二进制的工具,如上图,经过压缩之后,这些 binary 的体积都减少了 46%。 静态链接 CGO 的依赖 如果使用 glibc 的是,是不能静态链接的: rootf88271a666f9:/workspace# g…...
力扣解法汇总1124. 表现良好的最长时间段
目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给你一份工作时间表 hours,上面记录着某一位员工每天的工作小时数。…...
12- 降维算法 (PCA降维/LDA分类/NMF) (数据处理)
数据降维就是一种对高维度特征数据预处理方法。降维是将高维度的数据保留下最重要的一些特征,去除噪声和不重要的特征,从而实现提升数据处理速度的目的。PCA算法有两种实现方法: 基于特征值分解协方差矩阵实现PCA算法基于SVD分解协方差矩阵实…...
QT+ OpenGL学习
文章目录QT OpenGLQOpenGLWidget:不需要GLFWQOpenGLFunction_X_X_Core:不需要GLAD你好,三角形顶点输入顶点着色器片段着色器链接着色器本节代码元素缓冲对象EBOQT交互GLSLGLSL支持的类型输入输出Uniform纹理纹理单元纹理环绕纹理过滤多级渐远纹理QT OpenGL 本篇完整…...
C语言(字符串输入)
目录 一.gets和puts组合 二.fgets()和fputs() 三.fgets()函数返回 四.fgets读取满问题 五.修改fgets函数,自动用\0替换\n 一.gets和puts组合 Gets()读取整行输入,知道遇到换行符,然后丢弃换行符,存储其余字符,并在这些字符的…...
背包问题求方案数(AcWing)(JAVA)
有 N件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出 最优选法的方案数。注意答案可能很大,请输出答…...
一篇文章带你读懂HashMap
HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一。可见HashMap的掌握是多重要。 一、HashMap源码分析 1、构造函数 让我们先从构造函数说起,HashMap有四个构造方法,别慌 1.1 HashMap() // 1.无参构造方法、// 构造一…...
Java如何进行优雅的判空——Optional类的灵活应用
0 引言 在Java Web项目开发中,经常令人头疼的NPE问题(NullPointerException)——空指针,例如我们在调用equal()方法时,就经常会出现NPE问题: String str null; str.equals("fsfs");…...
Fluent Python 笔记 第 12 章 继承的优缺点
重点是说明对 Python 而言尤为重要的两个细节: 子类化内置类型的缺点多重继承和方法解析顺序 12.1 子类化内置类型很麻烦 内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。 不要子类化内置类型,用户自己定义的类应 该继承 collections 模块(http…...
Go语言读取解析yml文件,快速转换yml到go struct
YAML (YAML Aint a Markup Language)是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被计算机程序识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入…...
第二十六章 java并发常见知识内容(ThreadLocal 详解)
JAVA重要知识点带着疑问看ThreadLocalGC 之后 key 是否为 null?ThreadLocalMap Hash 算法ThreadLocalMap Hash 冲突ThreadLocalMap.set()方法ThreadLocalMap过期 key 的探测式清理流程ThreadLocalMap扩容机制ThreadLocalMap.get()详解ThreadLocalMap过期 key 的启发…...
人类的第一语言是什么
其实机器智能始终存在一个争议 没有人类的肢体和感受器无法理解和感同身受 这不用想是自然,但是可以通过虚拟数据进行模拟,深度学习便是 深度学习是模拟简单输入输出的最好选择,但不是开放性的学习 没有智能交互的智能永远不是智能 就像狼孩一…...
jsp(全部知识点)
👌 棒棒有言:也许我一直照着别人的方向飞,可是这次,我想要用我的方式飞翔一次!人生,既要淡,又要有味。凡事不必太在意,一切随缘,缘深多聚聚,缘浅随它去。凡事…...
测试开发面试基础题
1.对测试开发的理解 测试开发首先离不开测试,而软件测试是指,在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量,并对其是否能满足设计要求进行评估的过程。 而且,现在不仅仅是通过手工测试来发…...
C++——多态|虚函数|重写|虚表
文章目录1. 多态的概念1.1 概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写虚函数重写的三个例外:2.4 普通调用和多态调用:2.5 C11 override 和 final2.6 重载、虚函数的覆盖(重写)、隐藏(重定义)的对比3. 抽象类(有关纯虚函数)3.1 …...
IPV4地址详解
文章目录IPV4地址分类编址划分子网无分类编制CIDR路由聚合应用规划(子网划分的细节)定长的子网掩码FLSM变长的子网掩码VLSMIPV4地址 IPV4地址就是给因特网(Internet)上的每一台主机(或路由器)的每一个接口…...
(一)初识Streamlit(附安装)
本入门指南介绍Streamlit的工作原理、如何在您首选的操作系统上安装Streamlit,以及如何创建第一个Streamlit应用程序! 1 安装 1.1 先决条件 Python 3.7 – Python 3.11 **注:我这里使用的是anaconda的虚拟环境,用pycharm编写代…...
【新】华为OD机试 - 斗地主 2(Python)| 刷完获取OD招聘渠道
斗地主 2 题目描述 在斗地主扑克牌游戏中,扑克牌由小到大的顺序为3 4 5 6 7 8 9 10 J Q K A 2 玩家可以出的扑克牌阵型有,单张,对子,顺子,飞机,炸弹等 其中顺子的出牌规则为,由至少 5 张由小到大连续递增的扑克牌组成 且不能包含2 例如:{3,4,5,6,7}、{3,4,5,6,7,8,9,1…...
秒杀项目之消息推送
目录一、创建消费者二、创建订单链路配置2.1 定义RabbitMQ配置类2.2 创建RabbitmqOrderConfig配置类三、如何实现RabbitMQ重复投递机制3.1 开启发送者消息确认模式3.2 消费发送确认3.2.1 创建ConfirmCallBack确认模式3.2.2 创建ReturnCallBack退回模式3.3 创建生产者3.4 创建消…...
【重磅】IEEE33配电网两阶段鲁棒优化调度CCG
目录 1 前言 2基本内容 2.1 配网两阶段鲁棒模型 2.2 求解步骤 3部分程序 4程序结果 5程序链接 1 前言 鲁棒优化是电力系统研究的热点,而两阶段鲁棒和分布鲁棒研究就成为各类期刊(sci/ei/核心)的宠儿,最简单的思路是通过改…...
GPT2代码拆解+生成实例
本文代码来自博客,GPT2模型解析参考 import torch import copy import torch.nn as nn import torch.nn.functional as F from torch.nn.modules import ModuleList from torch.nn.modules.normalization import LayerNorm import numpy as np import os from tqd…...
做音乐网站需要版权么/网站免费进入窗口软件有哪些
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。 注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。 题目…...
专门做二维码的网站/微信scrm系统
随着互联网的快速发展,越来越多的支付APP出现,改变着人们的生活,给国人带来了很大的方便。众多的支付APP中,支付宝和微信支付市场占有率最高;现在各行各业都在使用支付宝和微信支付进行交易。 现在市场支付宝和微信支付…...
星月教你做网站的文档/360免费建站教程
阅读本文前,请您先点击上面的蓝色字体,再点击“关注”,这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅,请放心关注。总是在抖音上听到好听的日语歌曲,却不知道叫什么名字,今天就为大家…...
机关门户网站建设要求/营销策划的八个步骤
C - The SuspectsPOJ - 1611 点击打开链接 题意:现在是流感发病时期,学校有n个学生,学生编号为0~n-1,m个社团。0号学生是病毒携带者,如果有学生和病毒携带者在同一个社团,那么他也会变为病毒携带者。如 社…...
wordpress怎么添加音乐播放器/2023年5月疫情爆发
One option is have temp buffer start some known size then increase it if see it’s not enough with vsnprintf. Are there better approach? Thanks您可以使用vasprintf(),但这会进行不必要的堆分配 – 平均来说不太可能更快.使用alloca可以避免堆.或者,您可以直接写入返…...
wordpress反爬虫/西安网站建设排名
目录快速答案详细讲解举个例子方法 及 代码参考资料快速答案 使用星号占位符(*) printf("%*d", -4, "12"); // 或 printf("%-*d", 4, "12"); // 得到的输出:"12 " (12后面有两个空格)详…...