Jackson详解

文章目录

  • 一、Jackson介绍
  • 二、基础序列化和反序列化
    • 1、快速入门
    • 2、序列化API
    • 3、反序列化API
    • 4、常用配置
  • 三、常用注解
    • 1、@JsonProperty
    • 2、@JsonAlias
    • 3、@JsonIgnore
    • 4、@JsonIgnoreProperties
    • 5、@JsonFormat
    • 6、@JsonPropertyOrder
  • 四、高级特性
    • 1、处理泛型
      • 1.1、反序列化List泛型
      • 1.2、反序列化Map泛型
    • 2、自定义序列化和反序列化

一、Jackson介绍

  • Jackson库的核心功能是将Java对象转换为json字符串(序列化)以及将json字符串转换为Java对象(反序列化)
  • SpringMVC默认json解析器便是Jackson

与其他Java的json的框架相比

  • Jackson 解析的json文件速度比较快
  • Jackson 运行时占用内存比较,性能比较好
  • Jackson 有灵活的API,可以很容易进行扩展和定制

核心模块由三部分组成

  • jackson-core,核心包,提供基于"流模式"解析的相关API(JsonPaser和JsonGenerator),生成和解析json
  • jackson-annotations,注解包,提供标准注解功能
  • jackson-databind ,数据绑定包,提供基于"对象绑定"解析的相关API(ObjectMapper)和"树模型"解析的相关API(JsonNode)

其中 jackson-databind内部依赖了jackson-annotations与ackson-core,故只导入jackson-databind即可

<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.11.0</version>
</dependency>

二、基础序列化和反序列化

  • ObjectMapper是Jackson序列化和反序列化的核心类,提供了许多用于定制序列化和反序列化的方法和配置选项
  • 默认情况下,ObjectMapper在序列化对象时,将实体所有的字段一一序列化,无论这些字段是否有值,是否为null
  • 注意:如果实体的某个字段没有提供getter方法,则该字段不会被序列化
  • ObjectMapper主要用于对Java对象(比如 POJO、List、Set、Map等等)进行序列化与反序列化

1、快速入门

 @Testpublic void test1() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User();user.setAge(20);user.setBirthday(new Date());user.setName("张三");user.setAddress(null);// 序列化String jsonString = objectMapper.writeValueAsString(user);System.out.println("序列化字符串:" + jsonString);// 反序列化User userFromJson = objectMapper.readValue(jsonString, User.class);System.out.println("反序列化结果:" + userFromJson);}

输出结果:

序列化字符串:{"age":20,"name":"张三","birthday":1721266913536,"address":null}
反序列化结果:User(age=20, name=张三, birthday=Thu Jul 18 09:41:53 CST 2024, address=null)

2、序列化API

  • String writeValueAsString(Object value)(最常用)
    • 将任何Java对象()如 POJO、List、Set、Map等)序列化为json字符串
    • 如果对象中某个属性的值为null,则默认也会序列化为null
    • 如果value为null,返回序列化的结果也返回null
  • byte[] writeValueAsBytes(Object value)
    • 将Java对象序列化为字节数组
  • writeValue(File resultFile, Object value)
    • 将Java对象序列化并输出指定文件
  • writeValue(OutputStream out, Object value)
    • 将Java对象序列化并输出到指定字节输出流
@Test
public void test2() throws IOException {ObjectMapper objectMapper = new ObjectMapper();User user = new User();user.setAge(20);user.setBirthday(new Date());user.setName("张三");user.setAddress(null);// 序列化bytbyte[] bytes = objectMapper.writeValueAsBytes(user);System.out.println("序列化字节数组:" + new String(bytes));// 序列化到文件objectMapper.writeValue(new File("/Users/xuchang/Documents/json.txt"), user);
}

输出结果:

在这里插入图片描述

3、反序列化API

  • T readValue(String content, Class valueType)(最常用)
    • 从给定的json字符串反序列化为Java对象
    • valueType表示反序列化的任何Class对象(如 POJO、List、Set、Map等)
    • content为空或者为null,都会报错
  • T readValue(byte[] src, Class valueType)
    • 将json内容的字节数组反序列化为Java对象
  • T readValue(File src, Class valueType)
    • 将本地json内容的文件反序列化为Java对象
  • T readValue(InputStream src, Class valueType)
    • 将json内容的字节输入流反序列化为Java对象
  • T readValue(Reader src, Class valueType)
    • 将json内容的字符输入流反序列化为Java对象
  • T readValue(URL src, Class valueType)
    • 通过网络url地址将json内容反序列化为Java对象

4、常用配置

private static final ObjectMapper objectMapper;static {// 创建ObjectMapper对象objectMapper = new ObjectMapper();// configure方法 配置一些需要的参数// 转换为格式化的json 显示出来的格式美化objectMapper.enable(SerializationFeature.INDENT_OUTPUT);// 序列化的时候序列对象的那些属性// JsonInclude.Include.NON_DEFAULT 属性为默认值不序列化// JsonInclude.Include.ALWAYS      所有属性// JsonInclude.Include.NON_EMPTY   属性为 空(“”) 或者为 NULL 都不序列化// JsonInclude.Include.NON_NULL    属性为NULL 不序列化objectMapper.setSerializationInclusion(JsonInclude.Include.NON_EMPTY);// 反序列化时,遇到未知属性会不会报错// true - 遇到没有的属性就报错// false - 没有的属性不会管,不会报错objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 如果是空对象的时候,不抛异常objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);// 忽略 transient 修饰的属性objectMapper.configure(MapperFeature.PROPAGATE_TRANSIENT_MARKER, true);// 去除默认时间戳格式objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);// 设置为中国北京时区objectMapper.setTimeZone(TimeZone.getTimeZone("GMT+8"));// 序列化日期格式 Date类型格式化objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));// 处理java8不同时间类型JavaTimeModule module = new JavaTimeModule();module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));module.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));module.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(("HH:mm:ss"))));module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));module.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd")));module.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern("HH:mm:ss")));// 序列换成json时,将所有的long变成string(因为js中得数字类型不能包含所有的java long值)module.addSerializer(Long.TYPE, ToStringSerializer.instance);module.addSerializer(Long.class, ToStringSerializer.instance);objectMapper.registerModule(module);
}@Test
public void testObjectMapper() throws JsonProcessingException {User user = new User();user.setId(1770376103094779915L);user.setAge(20);user.setBirthday(new Date());user.setName("张三");user.setAddress(null);user.setLocalDateTime(LocalDateTime.now());// 序列化String jsonString = objectMapper.writeValueAsString(user);System.out.println("序列化字符串:" + jsonString);// 注意这里添加不存在的属性hobby,反序列化不会报错jsonString = "{\"id\":1770376103094779915,\"age\":20,\"name\":\"张三\",\"birthday\":\"2024-07-19 11:02:19\",\"hobby\":\"打篮球\"}";// 反序列化User userFromJson = objectMapper.readValue(jsonString, User.class);System.out.println("反序列化结果:" + userFromJson);
}
@Data
public class User {private Long id;private Integer age;private String name;private Date birthday;private String address;private LocalDateTime localDateTime;
}

输出结果:

序列化字符串:{"id" : "1770376103094779915","age" : 20,"name" : "张三","birthday" : "2024-07-19 14:27:48","localDateTime" : "2024-07-19 14:27:48"
}
反序列化结果:User(id=1770376103094779915, age=20, name=张三, birthday=Fri Jul 19 11:02:19 CST 2024, address=null, localDateTime=null)

三、常用注解

1、@JsonProperty

  • 用于在Java对象的属性和json字段之间建立映射关系
    • value:用于指定json属性的名称,当Java属性和json属性名称不一致时使用
    • index:指示此属性的数字索引的属性
    • access:用于指定该属性的访问方式
      • JsonAccess.READ_ONLY(只读-序列化可见)
      • JsonAccess.WRITE_ONLY(只写-反序列化可见)
      • JsonAccess.READ_WRITE(可读可写)
@Test
public void test3() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User();user.setAge(18);user.setName("张三");user.setAddress("北京");user.setBirthday(new Date());// 序列化为json字符串String jsonString = objectMapper.writeValueAsString(user);System.out.println(jsonString);// 反序列化为对象String userJson = "{\"age\":18,\"user_address\":\"北京\",\"user_birthday\":1721309276459,\"user_name\":\"张三\"}";User userValue = objectMapper.readValue(userJson, User.class);System.out.println(userValue);
}@Data
public class User {@JsonProperty(index = 0)private Integer age;@JsonProperty(value = "user_name", access = JsonProperty.Access.READ_ONLY, index = 3)private String name;@JsonProperty(value = "user_birthday", access = JsonProperty.Access.WRITE_ONLY, index = 2)private Date birthday;@JsonProperty(value = "user_address", access = JsonProperty.Access.READ_WRITE, index = 1)private String address;
}

输出结果:

{"age":18,"user_address":"北京","user_name":"张三"}
User(age=18, name=null, birthday=Thu Jul 18 21:27:56 CST 2024, address=北京)
  • 序列化属性名称及value设置的名称
  • 序列化根据index属性排序,反序列化还是类自上而下的顺序
  • 只读属性可以序列化,只写属性可以反序列化(读和写是相对内存中对象来理解的)

2、@JsonAlias

  • 在反序列化的时候可以让Bean的属性接收多个json字段的名称
@Test
public void test4() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();// 反序列化为对象String userJson = "{\"age\":18,\"address\":\"北京\",\"birthday\":1721309276459,\"nick_name\":\"张三\"}";User userValue = objectMapper.readValue(userJson, User.class);System.out.println(userValue);
}@Data
public class User {private Integer age;@JsonAlias(value = {"nick_name","vip_name"})private String name;private Date birthday;private String address;
}

输出结果:

User(age=18, name=张三, birthday=Thu Jul 18 21:27:56 CST 2024, address=北京)

3、@JsonIgnore

  • 序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响
  • 一般标记在属性或者方法上,返回的json数据即不包含该属性
@Test
public void test5() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User();user.setAge(18);user.setName("张三");user.setAddress("北京");user.setBirthday(new Date());// 序列化为json字符串String jsonString = objectMapper.writeValueAsString(user);System.out.println(jsonString);// 反序列化为对象String userJson = "{\"age\":18,\"address\":\"北京\",\"birthday\":1721309276459,\"name\":\"张三\"}";User userValue = objectMapper.readValue(userJson, User.class);System.out.println(userValue);
}
@Data
public class User {@JsonIgnoreprivate Integer age;@JsonIgnoreprivate String name;private Date birthday;private String address;
}

输出结果:

{"birthday":1721310730459,"address":"北京"}
User(age=null, name=null, birthday=Thu Jul 18 21:27:56 CST 2024, address=北京)

4、@JsonIgnoreProperties

  • 序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响
@Data
@JsonIgnoreProperties({"age", "name"})
public class User {private Integer age;private String name;private Date birthday;private String address;
}

5、@JsonFormat

  • 时间格式化注解
    • pattern: 表示日期的格式,比如:yyyy-MM-dd HH:mm:ss
    • timezone: 默认是GMT,中国需要GMT+8
      • 中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
      • 格林尼治时间(GMT) = 世界协调时间(UTC) + 0
@Test
public void test6() throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();User user = new User();user.setAge(18);user.setName("张三");user.setAddress("北京");user.setBirthday(new Date());// 序列化为json字符串String jsonString = objectMapper.writeValueAsString(user);System.out.println(jsonString);// 反序列化为对象User userValue = objectMapper.readValue(jsonString, User.class);System.out.println(userValue);
}
@Data
public class User {private Integer age;private String name;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date birthday;private String address;
}

输出结果:

{"age":18,"name":"张三","birthday":"2024-07-18 22:10:36","address":"北京"}
User(age=18, name=张三, birthday=Thu Jul 18 22:10:36 CST 2024, address=北京)

6、@JsonPropertyOrder

  • 用于指定实体生成json时的属性顺序
// 自定义顺序
@JsonPropertyOrder({"name", "age", "address"})
//按字母排序
@JsonPropertyOrder(alphabetic=true)

四、高级特性

1、处理泛型

1.1、反序列化List泛型

  • 可以使用CollectionType类型反序列化,也可以构造TypeReference反序列化
@Test
public void test7() throws JsonProcessingException {ObjectMapper mapper = new ObjectMapper();CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, User.class);// 造数据List<User> list = new ArrayList<>();for (int i = 0; i < 3; i++) {User user = new User();user.setId((long) i);user.setName("张三" + i);list.add(user);}System.out.println("序列化");String jsonInString = mapper.writeValueAsString(list);System.out.println(jsonInString);System.out.println("反序列化:使用 javaType");List<User> userList1 = mapper.readValue(jsonInString, javaType);System.out.println(userList1);System.out.println("反序列化:使用 TypeReference");List<User> userList2 = mapper.readValue(jsonInString, new TypeReference<List<User>>() {});System.out.println(userList2);
}
@Data
public class User {private Long id;private String name;
}

输出:

序列化
[{"id":0,"name":"张三0"},{"id":1,"name":"张三1"},{"id":2,"name":"张三2"}]
反序列化:使用 javaType
[User(id=0, name=张三0), User(id=1, name=张三1), User(id=2, name=张三2)]
反序列化:使用 TypeReference
[User(id=0, name=张三0), User(id=1, name=张三1), User(id=2, name=张三2)]

1.2、反序列化Map泛型

  • 可以使用MapType类型反序列化,也可以构造TypeReference反序列化
@Test
public void test8() throws IOException {ObjectMapper mapper = new ObjectMapper();//第二参数是 map 的 key 的类型,第三参数是 map 的 value 的类型MapType javaType = mapper.getTypeFactory().constructMapType(HashMap.class, String.class, User.class);// 造数据Map<String, User> map = new HashMap<>();for (int i = 0; i < 3; i++) {User user = new User();user.setId((long) i);user.setName("张三" + i);map.put("key" + i, user);}System.out.println("序列化");String jsonInString = mapper.writeValueAsString(map);System.out.println(jsonInString);System.out.println("反序列化: 使用 javaType");Map<String, User> userMap1 = mapper.readValue(jsonInString, javaType);System.out.println(userMap1);System.out.println("反序列化: 使用 TypeReference");Map<String, User> userMap2 = mapper.readValue(jsonInString, new TypeReference<Map<String, User>>() {});System.out.println(userMap2);
}

输出结果:

序列化
{"key1":{"id":1,"name":"张三1"},"key2":{"id":2,"name":"张三2"},"key0":{"id":0,"name":"张三0"}}
反序列化: 使用 javaType
{key1=User(id=1, name=张三1), key2=User(id=2, name=张三2), key0=User(id=0, name=张三0)}
反序列化: 使用 TypeReference
{key1=User(id=1, name=张三1), key2=User(id=2, name=张三2), key0=User(id=0, name=张三0)}

2、自定义序列化和反序列化

  • 序列化类继承抽象类JsonSerializer,需要的字段或类上使用@JsonSerialize注解
  • 反序列化类继承抽象类JsonDeserializer,需要的字段或类上使用@JsonDeserialize注解
public class LongSerializer extends JsonSerializer<Long> {@Overridepublic void serialize(Long value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeString(value.toString());}
}@Data
public class User {@JsonSerialize(using = LongSerializer.class)private Long id;private String name;
}

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

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

相关文章

Java 写一个可以持续发送消息的socket服务端

前言 最近在学习flink, 为了模仿一个持续的无界的数据源, 所以需要一个可以持续发送消息的socket服务端. 先上效果图 效果图 socket服务端可以持续的发送消息, flink端是一个统计单词出现总数的消费端,效果图如下 源代码 flink的消费端就不展示了, 需要引入一些依赖和版本…

Linux系统编程基础

Linux操作系统 Linux不是一个具体的操作系统&#xff0c;而是一类操作系统的总称&#xff0c;具体版本成为发行版。 Red Hat&#xff1a;目前被IBM收购&#xff0c;收费版&#xff0c;目前最大的Linux供应商CentOS&#xff1a; Red Hat退出的免费版Ubuntu&#xff1a;界面比较友…

二十一、【机器学习】【非监督学习】- 谱聚类 (Spectral Clustering)​​

系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…

hung 之 Android llkd

目录 1. llkd 简介 2. 原理 2.1 内核活锁 2.2 检测机制 2.3 为什么 persistent stack signature 检测机制不执行 ABA 检查&#xff1f; 2.4 为什么 kill 进程后&#xff0c;进程还存在就能判定发生了内核 live-lock&#xff1f; 3. 代码 3.1 内核 live-lock 检查 3.2 …

摸鱼大数据——用户画像——如何给用户“画像”

2、如何给用户“画像” 2.1 什么是标签体系 标签: 是某一种用户特征的符号表示 标签体系: 把用户分到多少类别里面去, 这些类是什么, 彼此之间有什么关系, 就构成了标签体系 标签解决的问题: 解决描述(或命名)问题以及解决数据之间的关联 2.2.1 标签的分类 用户画像标签一…

【附源码】IMX6U嵌入式Linux开发板连接阿里云--MQTT协议

演示 IMX6U嵌入式Linux开发板连接阿里云 阿里云创建设备&&获取LinkSDK 如果还不知道怎么在阿里云创建设备和获取连接阿里云的LinkSDK的话&#xff0c;先看这篇文章&#xff0c;再到这里。看这篇文章的时候&#xff0c;麻烦将下方文章打开对照着看&#xff0c;因为一些…

重测序数据处理得到vcf文件

重测序数据处理得到vcf文件 文章目录 重测序数据处理前言1. 数据是rawdata&#xff0c;需用fastp对数据进行质控和过滤2. 利用getorganelle软件组装叶绿体基因组3. 检查基因组大小&#xff0c;确认是否完整&#xff0c;然后和已知的红毛菜科叶绿体基因组一起构树4. 根据树形结果…

微积分-微分应用2(平均值定理)

要得出平均值定理&#xff0c;我们首先需要以下结果。 罗尔定理 设函数 f f f 满足以下三个假设&#xff1a; f f f 在闭区间 [ a , b ] [a, b] [a,b] 上连续。 f f f 在开区间 ( a , b ) (a, b) (a,b) 上可导。 f ( a ) f ( b ) f(a) f(b) f(a)f(b) 则在开区间 ( a , b …

CTFHUB-SQL注入-UA注入

目录 判断是否存在注入 判断字段数量 判断回显位置 查询数据库名 查询数据库下的表名 查询表中的字段名 查询字段名下的数据 由于本关是UA注入&#xff0c;就不浪费时间判断是什么注入了&#xff0c;在该页面使用 burp工具 抓包&#xff0c;修改User-Agent&#xff0c;加…

JavaScript之Web APIs-DOM

目录 DOM获取元素一、Web API 基本认知1.1 变量声明1.2 作用和分类1.3 DOM树1.4 DOM对象 二、获取DOM对象2.1 通过CSS选择器来获取DOM元素2.2 通过其他方式来获取DOM元素 三、操作元素内容3.1 元素.innerTest属性3.2 元素.innerHTML属性 四、操作元素属性4.1 操作元素常用属性4…

图形编辑器基于Paper.js教程09:鼠标拖动画布,以鼠标点为缩放中心进行视图的缩放

如何使用Paper.js实现画布的缩放与拖动功能 在Web开发中&#xff0c;利用Paper.js库进行图形的绘制和交互操作是一种常见的实践。Paper.js是一个强大的矢量图形库&#xff0c;可以让开发者通过简洁的API完成复杂的图形操作。在本文中&#xff0c;我们将详细探讨如何使用Paper.…

昇思25天学习打卡营第29天 | 基于MindSpore通过GPT实现情感分类

基于MindSpore框架通过GPT模型实现情感分类展示了从项目设置、数据预处理到模型训练和评估的详细步骤&#xff0c;提供了一个完整的案例来理解如何在自然语言处理任务中实现情感分析。 首先&#xff0c;环境配置是任何机器学习项目的起点。项目通过安装特定版本的MindSpore和相…

未来已来:生成式 AI 在对话系统与自主代理中的探索

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 一、整体介绍 对话系统&#xff08;Chat&#xff09; 自主代理&#xff08;Agent&#xff09; 二、技术对比 技术差异 优…

安装anaconda后jupyter notebook打不开 闪退

首先&#xff0c;通过清华源安装了最新的anaconda&#xff08;安装在了D盘&#xff09; 尝试打开jupyter&#xff0c;发现小黑框1s后自己关了&#xff0c;根本不打开浏览器 之后尝试按照这个做了一遍https://blog.csdn.net/gary101818/article/details/123560304还是不行。。…

【BUG】已解决:TypeError: Descriptors cannot not be created directly.

已解决&#xff1a;TypeError: Descriptors cannot not be created directly. 目录 已解决&#xff1a;TypeError: Descriptors cannot not be created directly. 【常见模块错误】 【错误原因】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来…

创建和管理大量的数据对象:ScriptableObject

一、创建一个继承自ScriptableObject&#xff0c;名为ItemData的类 1、ItemData.cs using UnityEngine;[CreateAssetMenu(menuName "Items/Item")] public class ItemData : ScriptableObject {public string description;public Sprite thumbnail;public GameObj…

数据挖掘-分类和预测

来自&#x1f96c;&#x1f436;程序员 Truraly | 田园 的博客&#xff0c;最新文章首发于&#xff1a;田园幻想乡 | 原文链接 | github &#xff08;欢迎关注&#xff09; 文章目录 概念KNN 算法决策树ID3 算法缺点 C4.5 算法CART 算法 贝叶斯算法朴素贝叶斯算法贝叶斯信念网络…

如何做好结构化逻辑分析:分析之万能公式

有人问&#xff1a;我看了很多书&#xff0c;可是一到分析问题和解决问题时&#xff0c;还是不知如何下手。你能给我一个万能框架吗&#xff1f;这样我遇到问题就可以马上找到思路、直接套用&#xff0c;再也不用让大脑去神游和不知所措了。 我想了想&#xff0c;总结出了这个…

突破•指针二

听说这是目录哦 复习review❤️野指针&#x1fae7;assert断言&#x1fae7;assert的神奇之处 指针的使用和传址调用&#x1fae7;数组名的理解&#x1fae7;理解整个数组和数组首元素地址的区别 使用指针访问数组&#x1fae7;一维数组传参的本质&#x1fae7;二级指针&#x…

2-41 基于matlab的小车倒立摆系统的控制及GUI动画演示

基于matlab的小车倒立摆系统的控制及GUI动画演示。输入小车及倒立摆的初始参数&#xff0c;位置参数&#xff0c;对仿真时间和步长进行设置&#xff0c;通过LQR计算K值&#xff0c;进行角度、角速度、位置、速度仿真及曲线输出&#xff0c;程序已调通&#xff0c;可直接运行。 …