当前位置: 首页 > news >正文

Json工具(一)- Jackson(续)

5、Jackson常用注解

@JsonProperty
自定义属性在序列化和反序列化过程中所对应的JSON字段的名称,还可以指定是否序列化和反序列化。属性如下:
value:设置属性的名称。一般当JSON串中的key与对象中的属性名称不一致,比如分别采用了下划线命名与驼峰命名。
defaultValue:用于记录预期的默认值
required:定义在反序列化期间是否需要属性的值。
index:序列化时属性的顺序,默认为-1,越小越靠前。
access:更改序列化和反序列化中逻辑属性的可见性,A逻辑属性的可见性仅根据可见性和其他注释确定,access的默认值。
READ_ONLY 逻辑属性仅在序列化时可见(属性值参与序列化)、WRITE_ONLY 逻辑属性仅在反序列化时可见(属性值参与反序列化)、READ_WRITE 逻辑属性在序列化和反序列化时都可见
@JsonAlias
反序列化的时候可以让Bean的属性接收多个json字段的名称。
@JsonAutoDetect
控制序列化和反序列化过程中Java对象中访问修饰符的序列化策略。用于注解或者类上,默认为ANY。
@JsonIgnore
在json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。一般标记在属性或者方法上,返回的json数据即不包含该属性。
@JsonIgnoreProperties
此注解是类注解,作用是json序列化时将java bean中的一些属性忽略掉,序列化和反序列化都受影响。
@JsonIgnoreType
该类作为别的类的属性时,该属性忽略序列化和反序列化。
@JsonInclude
是为实体类在接口序列化返回值时增加规则的注解
ALWAYS为默认值,表示全部序列化,即默认返回全部字段
NON_NULL表示值为null就不序列化,即值为null的字段不返回(当实例对象中有Optional或AtomicReferenceAtomicReferenceAtomicReference类型的成员变量时,如果Optional或AtomicReference引用的实例为null,用NON_NULL 不能使该字段不做序列化,此时应使用NON_ABSENT规则)
NON_ABSENT可在实例对象中有Optional或AtomicReference类型的成员变量时,如果Optional或AtomicReference引用的实例为null时,也可使该字段不做序列化,同时可以排除值为null的字段
NON_EMPTY排除字段值为null、空字符串、空集合、空数组、Optional类型引用为空,AtomicReference类型引用为空
NON_DEFAULT没有更改的字段不序列化,即未变动的字段不返回
CUSTOM:这个值要配合valueFilter属性一起使用,在序列化的时候会执行CustomFilter中的的equals方法,该方法的入参就是字段的值,如果equals方法返回true,字段就不会被序列化,如果equals方法返回false时字段才会被序列化,即true时不返回,false时才返回

@JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = CustomFilter.class)
private String field;static class CustomFilter {@Overridepublic boolean equals(Object obj) {// 为null,或者不是字符串就返回true,即不返回该字段if (null == obj || !(obj instanceof String)) {return true;}// 长度大于2就返回true,意味着不被序列化return ((String) obj).length() > 2;}
}
@JsonFormat
是一个时间格式化注解,比如我们存储在mysql中的数据是date类型的,当我们读取出来封装在实体类中的时候,就会变成英文时间格式,而不是yyyy-MM-dd HH:mm:ss这样的中文时间,因此我们需要用到JsonFormat注解来格式化我们的时间。
@JsonUnwrapped
表明属性应该以扁平化的形式进行序列化,即目标属性将不会序列化为 JSON 对象,但其属性将序列化为包含它的对象的属性。
@JacksonInject
在使用JSON格式进行反序列化的时候,我们经常有这样一些需求。我们从客户端或者其他渠道获取了一个JSON格式的数据对象,该对象包含若干个属性。但是我们在将JSON字符串反序列化的时候,需要给它加上一些默认数据

@Data
public class PlayerStar {private String name;private Integer age;// 业余爱好,数组private String[] hobbies;// 朋友private List<String> friends;// 年收入 Mapprivate Map<String, BigDecimal> salary;@JacksonInject("responseTime")private LocalDateTime responseTime;
}public class App {public static void main(String[] args) throws Exception {ObjectMapper objectMapper = new ObjectMapper();// 为responseTime赋值为当前值InjectableValues.Std injectableValues = new InjectableValues.Std();injectableValues.addValue("responseTime", LocalDateTime.now());// 在反序列化过程中赋值给对象objectMapper.setInjectableValues(injectableValues);String jsonInString = "{\"name\":\"乔丹\",\"age\":45,\"hobbies\":[\"高尔夫球\",\"棒球\"]}";PlayerStar jordan = objectMapper.readValue(jsonInString, PlayerStar.class);System.out.println(jordan);}}
@JsonAnyGetter和@JsonAnySetter
@JsonAnySetter:可以将序列化时未识别到的属性都扔进一个map里。
@JsonAnyGetter:将map里的属性都平铺输出。
public class TestAnyGetterAndSetter {public static void main(String[] args) throws JsonProcessingException {String json1 = "{\"name\":\"zhangSan\",\"id\":1,\"address\":\"china\"}";ObjectMapper objectMapper = new ObjectMapper();Account account = objectMapper.readValue(json1, Account.class);System.out.println(account.getMap());String jsonString = objectMapper.writeValueAsString(account);System.out.println(jsonString);}}class Account {private long id;private String name;private Map<String, Object> map;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}@JsonAnySetterpublic void setMap(String key, Object value) {if (map == null) {map = new HashMap<>();}map.put(key, value);}@JsonAnyGetterpublic Map<String, Object> getMap() {return map;}
}
@JsonSetter 和 @JsonGetter
@JsonSetter 和 @JsonGetter:@JsonSetter只能用于setter方法,@JsonGetter只能用户getter方法,只用二者中的一个标签时,与@JsonProperty作用一模一样。
@JsonCreator
用于构造方法或者静态方法上面,加了@JsonCreator注解,该类的对象在反序列化时,就走有@JsonCreator注解的方法来反序列化,原先无参+set的过程失效。
public class TestJsonCreator {public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();Page page = objectMapper.readValue("{" +"    \"page_size\":12,\n" +"    \"page_num\":1,\n" +"    \"name\":\"Java\"\n" +"}", Page.class);System.out.println(page);}
}@Data
@AllArgsConstructor
class Page {@JsonProperty(value = "page_size")private int pageSize;@JsonProperty(value = "page_num")private int pageNum;private String name;@JsonCreatorpublic static Page unSerialize() {System.out.println("正在反序列化成对象");return new Page(12, 1, "Java");}
}
public class TestJsonCreator {public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();Page page = objectMapper.readValue("{" +"    \"page_size\":12,\n" +"    \"page_num\":1,\n" +"    \"name\":\"Java\"\n" +"}", Page.class);System.out.println(page);}
}@Data
class Page {@JsonProperty(value = "page_size")private int pageSize;@JsonProperty(value = "page_num")private int pageNum;private String name;@JsonCreatorpublic Page(@JsonProperty("name") String name,@JsonProperty("page_num") int pageNum,@JsonProperty("page_size") int pageSize) {System.out.println("@JsonCreator生效");this.pageNum = pageNum;this.pageSize = pageSize;this.name = name;}
}
@JsonValue
用于get方法、属性字段,一个类只能用一个,加上这个注解时,该类的对象序列化时就会只返回这个字段的值做为序列化的结果。比如一个枚举类的get方法上加上该注解,那么在序列化这个枚举类的对象时,返回的就是枚举对象的这个属性,而不是这个枚举对象的序列化json串。
@JsonPropertyOrder
用于指定实体生成 json 时的属性顺序,一般用得不多
@JsonRawValue
能够按原样序列化属性。属性值不会被转义或者加引号(或者说,会自动去掉转义,多余的引号)。属性值已经是一个 JSON String,或者属性值已经被加了引号时很有用。
public class TestJsonRawValue {public static void main(String[] args) throws JsonProcessingException {News news = new News();news.setContent("\"中国No.1\"");news.setTitle("中国崛起!");news.setPublishTime(new Date());System.out.println("-- before serialization --");ObjectMapper objectMapper = new ObjectMapper();String jsonString = objectMapper.writeValueAsString(news);System.out.println(jsonString);News news1 = objectMapper.readValue(jsonString, News.class);System.out.println(news1);}
}@Data
class News {@JsonRawValueprivate String content;private String title;@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date publishTime;
}
-- before serialization --
{"content":"\"中国No.1\"","title":"中国崛起!","publishTime":"2024-02-28 10:47:00"}
News(content="中国No.1", title=中国崛起!, publishTime=Wed Feb 28 10:47:00 CST 2024)-- after serialization --
{"content":"中国No.1","title":"中国崛起!","publishTime":"2024-02-28 10:47:41"}
News(content=中国No.1, title=中国崛起!, publishTime=Wed Feb 28 10:47:41 CST 2024)
@JsonRootName
用来指定root wrapper的名字。注意,只有当WRAP_ROOT_VALUE开启时,此注解才生效
@JsonSerialize
用于字段或get方法上,自定义序列化过程
@JsonDeserialize
用于字段或set方法上,自定义反序列化过程
@JacksonAnnotation
标注该注解是Jackson的注解,会被Jackson处理
@JacksonAnnotationsInside
自定义Jackson注解的组合注解
@JsonView
不同请求获取的对象的视图不同(属性数量不一致),使用@JsonView配合自定义视图实现
public class CompanyViews {public static class Normal {};public static class Manager extends Normal {};public static class HR extends Normal {};}
public class Staff {@JsonView(CompanyViews.Normal.class)private String name;@JsonView(CompanyViews.Normal.class)private int age;// two views@JsonView({CompanyViews.HR.class, CompanyViews.Manager.class})private String[] position;@JsonView(CompanyViews.Manager.class)private List<String> skills;@JsonView(CompanyViews.HR.class)private Map<String, BigDecimal> salary;
}    
public class JacksonExample {public static void main(String[] args) {ObjectMapper mapper = new ObjectMapper();Staff staff = createStaff();try {mapper.enable(SerializationFeature.INDENT_OUTPUT);// normalString normalView = mapper.writerWithView(CompanyViews.Normal.class).writeValueAsString(staff);System.out.format("Normal views\n%s\n", normalView);// managerString managerView = mapper.writerWithView(CompanyViews.Manager.class).writeValueAsString(staff);System.out.format("Manager views\n%s\n", managerView);// hrString hrView = mapper.writerWithView(CompanyViews.HR.class).writeValueAsString(staff);System.out.format("HR views\n%s\n", hrView);} catch (IOException e) {e.printStackTrace();}}private static Staff createStaff() {Staff staff = new Staff();staff.setName("mkyong");staff.setAge(38);staff.setPosition(new String[]{"Founder", "CTO", "Writer"});Map<String, BigDecimal> salary = new HashMap() {{put("2010", new BigDecimal(10000));put("2012", new BigDecimal(12000));put("2018", new BigDecimal(14000));}};staff.setSalary(salary);staff.setSkills(Arrays.asList("java", "python", "node", "kotlin"));return staff;}}
Normal views
{"name" : "mkyong","age" : 38
}Manager views
{"name" : "mkyong","age" : 38,"position" : [ "Founder", "CTO", "Writer" ],"skills" : [ "java", "python", "node", "kotlin" ]
}HR views
{"name" : "mkyong","age" : 38,"position" : [ "Founder", "CTO", "Writer" ],"salary" : {"2018" : 14000,"2012" : 12000,"2010" : 10000}
}

6、自定义序列化和反序列化案例

自定义序列化工具的步骤

  1. 实现JsonSerializer自定义序列化逻辑
  2. 实现JsonDeserializer自定义反序列化逻辑
    如需获取字段相关的其他元素信息需要实现ContextualDeserializer
    接口获取上下文。然后获取字段的JavaType,Jackson提供了TypeFactory获取JavaType,调用ObjectCodec工具反序列化
    没有泛型无需获取JavaType,直接使用readValue(String content, Class valueType)
  3. 在需要处理的字段添加注解
/*案例相关entity*/
@Data
public class MyDto {@ObjAndArrayConverter(clazz = Bodys.class, internal = Person.class)@JsonProperty("bodys")private Bodys<Person> bodys;
}@Data
public class Bodys<T> {@JsonProperty("commonField")private String commonField;private T body;
}@Data
@JsonAutoDetect(getterVisibility = JsonAutoDetect.Visibility.ANY)
public class Person {@JsonProperty(value = "myName", index = 4)private String name;@JsonProperty(value = "myAge", index = 3)private Integer age;@JsonProperty(value = "birthday", index = 2)@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")@JsonInclude(JsonInclude.Include.NON_NULL)private Date date;@JsonProperty(value = "myHeight", index = 1)private int height;@JsonIgnoreprivate Action action;@JacksonInject(value = "responseTime")private Date responseTime;
}
/*自定义序列化工具*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@JacksonAnnotationsInside
@JsonDeserialize(using = ObjAndArrayDeserializer.class)
@JsonSerialize(using = ObjAndArraySerializer.class)
public @interface ObjAndArrayConverter {Class<?> clazz();Class<?> internal();
}/*自定义序列化处理逻辑*/
public class ObjAndArraySerializer extends JsonSerializer {@Overridepublic void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException {gen.writeStartArray();gen.writeObject(value);gen.writeEndArray();}
}/*自定义反序列化处理逻辑*/
public class ObjAndArrayDeserializer extends StdDeserializer<Object> implements ContextualDeserializer {private Class<?> clazz;private Class<?> internal;/*** jackson 反序列化执行的时候需要知道当前的字段需要反序列化到哪个对象,需要获取对应的JavaType,如果没有泛型可以不获取JavaType。* 如果是Person的JavaType TypeFactory.defaultInstance().constructType(Person.class);可以不获取JavaType,直接使用readValue(String content, Class<T> valueType)*/private JavaType javaType;public ObjAndArrayDeserializer(Class<?> clazz, Class<?> internal) {super(clazz);this.clazz = clazz;this.internal = internal;// 获取JavaType的工厂对象以获取JavaTypeTypeFactory typeFactory = TypeFactory.defaultInstance();// 获取Bodys<Person>对应的JavaTypethis.javaType = typeFactory.constructParametricType(this.clazz, this.internal);// 如果是List<Person>对应的JavaType,TypeFactory.defaultInstance().constructParametricType(List.class,Person.class);}public ObjAndArrayDeserializer() {super(Object.class);}@Overridepublic Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JacksonException {JsonToken currentToken = p.getCurrentToken();if (currentToken == JsonToken.START_ARRAY) {p.nextToken();Object o = p.getCodec().readValue(p, this.javaType);p.nextToken();return o;} else {return null;}}/*获取Field的相关信息,以获取对应的JavaType,缓存了反序列化器,需要重启才会再走*/@Overridepublic JsonDeserializer<?> createContextual(DeserializationContext ctxt, BeanProperty property) throws JsonMappingException {ObjAndArrayConverter converter = property.getAnnotation(ObjAndArrayConverter.class);this.clazz = converter.clazz();this.internal = converter.internal();return new ObjAndArrayDeserializer(converter.clazz(), converter.internal());}
}

7、Jackson多态的序列化与反序列化


@JsonTypeInfo(use = JsonTypeInfo.Id.NAME,include = JsonTypeInfo.As.EXISTING_PROPERTY,property = "type",visible = true
)
@JsonSubTypes(value = {@JsonSubTypes.Type(value = JacksonProduct1.class, name = "product1"),@JsonSubTypes.Type(value = JacksonProduct2.class, name = "product2")}
)
@Data
public abstract class JacksonParent {/*抽象的公有字段*/private String year = "2024";
}@Data
public class JacksonProduct1 extends JacksonParent {private String type = "product1";private String name;
}@Data
public class JacksonProduct2 extends JacksonParent {private String type = "product2";private String name;
}@Data
public class JacksonProduct {private List<JacksonParent> jacksonProduct;
}public static void main(String[] args) throws JsonProcessingException {ObjectMapper objectMapper = new ObjectMapper();JacksonProduct jacksonProduct = new JacksonProduct();JacksonProduct1 jacksonProduct1 = new JacksonProduct1();jacksonProduct1.setName("json1");JacksonProduct2 jacksonProduct2 = new JacksonProduct2();jacksonProduct2.setName("json2");List<JacksonParent> list = new ArrayList<>();list.add(jacksonProduct1);list.add(jacksonProduct2);jacksonProduct.setJacksonProduct(list);String s = objectMapper.writeValueAsString(jacksonProduct);System.out.println("序列化成字符串:" + s);// 序列化成字符串:{"jacksonProduct":[{"year":"2024","type":"product1","name":"json1"},{"year":"2024","type":"product2","name":"json2"}]}System.out.println("转换后的实体类结果:");System.out.println(objectMapper.readValue(s, JacksonProduct.class));// JacksonProduct(jacksonProduct=[JacksonProduct1(type=product1, name=json1), JacksonProduct2(type=product2, name=json2)])
}

8、Jackson序列化和反序列化执行流程

Jackson序列化流程

1. 获取相关的ObjectCodec
2. 初始化JsonGenerator
3. 获取DefaultSerializerProvider
4. 获取JsonSerializer
5. 开始序列化
6. 关闭资源

Jackson反序列化流程

1. 获取相关的ObjectCodec
2. 初始化JsonParser
3. DefaultDeserializationContext
4. 初始化JsonToken
5. 获取JsonDeserializer
6. 开始反序列化
7. 关闭资源

相关文章:

Json工具(一)- Jackson(续)

5、Jackson常用注解 JsonProperty 自定义属性在序列化和反序列化过程中所对应的JSON字段的名称,还可以指定是否序列化和反序列化。属性如下&#xff1a; value&#xff1a;设置属性的名称。一般当JSON串中的key与对象中的属性名称不一致&#xff0c;比如分别采用了下划线命名与…...

MySQL-事务

事务 事务&#xff0c;一般指的是数据库事务&#xff0c;事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。 事务具有四个特性&#xff0c;即我们常说的ACID特性&#xff1a; 原子性 指事务是一个不可分割的工作单位&#xff0c;事务中的操作…...

课题推荐——无人机在UWB环境下基于TOA/TDOA/AOA的室内定位与精度对比

随着无人机在工业检测、仓储物流、应急救援等室内场景的广泛应用&#xff0c;高精度室内定位技术成为关键支撑。超宽带&#xff08;UWB&#xff09;技术凭借其高时间分辨率、强抗多径能力等优势&#xff0c;成为室内定位的主流方案。然而&#xff0c;不同的定位方法&#xff08…...

Qt6.8.2创建WebAssmebly项目使用FFmpeg资源

Qt6新出了WebAssmebly功能&#xff0c;可以将C写的软件到浏览器中运行&#xff0c;最近一段时间正在研究这方便内容&#xff0c;普通的控件响应都能实现&#xff0c;今天主要为大家分享如何将FFmpeg中的功能应用到浏览器中。 开发环境&#xff1a;window11&#xff0c;Qt6.8.2…...

【CSS】Tailwind CSS 与传统 CSS:设计理念与使用场景对比

1. 开发方式 1.1 传统 CSS 手写 CSS&#xff1a;你需要手动编写 CSS 规则&#xff0c;定义类名、ID 或元素选择器&#xff0c;并为每个元素编写样式。 分离式开发&#xff1a;HTML 和 CSS 通常是分离的&#xff0c;HTML 中通过类名或 ID 引用 CSS 文件中的样式。 示例&#…...

Server-Sent Events

Server-Sent Events (SSE) 是一种允许服务器向客户端推送实时更新的技术。 1. 创建 SSE 连接 export default {data() {return {eventSource: null,};},onLoad() {this.initSSE();},methods: {initSSE() {// 创建 SSE 连接this.eventSource new EventSource(https://api/xxxx…...

(十 九)趣学设计模式 之 中介者模式!

目录 一、 啥是中介者模式&#xff1f;二、 为什么要用中介者模式&#xff1f;三、 中介者模式的实现方式四、 中介者模式的优缺点五、 中介者模式的应用场景六、 总结 &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;…...

k8s概念及k8s集群部署(Centos7)

Centos7部署k8s集群 部署之前&#xff0c;先简单说下k8s是个啥&#xff1a; 一、k8s简介&#xff1a; k8s&#xff0c;全称&#xff1a;kubernetes&#xff0c;它可以看作是一个分布式系统支撑平台。k8s的作用&#xff1a; 1、故障自愈&#xff1a; k8s这个玩意可以监控容器…...

山东省网络安全技能大赛历年真题 山东网络安全创意大赛

刚参加完比赛&#xff0c;总结一波。 第一题:签到题 下载完成之后发现是个.exe文件 杂项万年套路步骤,用winhex打开&#xff0c;搜索flag&#xff0c;找到&#xff0c;提交。。。 第二题&#xff1a;qiu咪 发现是一张flag.png。。万年套路 用winhex打开。啥也没发现&#xf…...

数字后端培训实战项目六大典型后端实现案例

Q1:请教一个问题&#xff0c;cts.sdc和func.sdc在innovus用如何切换&#xff1f;在flow哪一步切换输入cts.sdc&#xff1f;哪一步切换到func.sdc&#xff0c;具体如何操作&#xff1f; 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的&#xff1f;针对时…...

Redis网络模型

redis为什么快 1.主要原因是因为redis是基于内存操作的&#xff0c;比起直接操作磁盘速度快好几倍 2.基于内存的数据库瓶颈主要是在网络io这一块&#xff0c;redis网络模型采用io多路复用技术能够高效的处理并发连接。 3.redis使用单线程执行命令&#xff0c;可以避免上下文…...

RangeError: Radix must be an integer between 2 and 36

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 &#x1f35a; 蓝桥云课签约作者、…...

题海拾贝:P9241 [蓝桥杯 2023 省 B] 飞机降落

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 1、题…...

机器学习数学基础:38.统计学模型变量

统计学模型变量类型详解教程 一、外生变量&#xff08;Exogenous Variable&#xff09; &#xff08;一&#xff09;定义与别名 外生变量是模型中不受其他变量影响的独立变量&#xff0c;通常充当自变量。其常见的别名有&#xff1a; 外部变量&#xff08;External Variabl…...

FPGA标准库-Open Logic

在现代技术发展的浪潮中&#xff0c;开源项目已经成为了推动技术创新和发展的核心力量。无论是人工智能、区块链、云计算&#xff0c;还是传统的嵌入式开发、操作系统&#xff0c;开源项目都在其中扮演着至关重要的角色。它们不仅促进了技术的快速迭代&#xff0c;也为全球开发…...

Git 批量合并 Commit 并且保留之前的 Commit 快速实现的思路

文章目录 需求Rebase / Pick / squashVim 的快速全局字符串替换 需求 我想把如下的提交 commit&#xff0c;变成一个 Commit&#xff0c;并且合并这些 Commit 的消息到一个节点 Rebase / Pick / squash 我合并到 5e59217 这个hash 上&#xff0c;这样合并后会保留两个 Commit…...

Jackson 详解

目录 前言 Jackson 是 Java 生态中最流行的 JSON 处理库之一&#xff0c;广泛应用于 RESTful API、数据存储和传输等场景。它提供了高效、灵活的 JSON 序列化和反序列化功能&#xff0c;支持注解、模块化设计和多种数据格式&#xff08;如 XML、YAML&#xff09;。本文将详细介…...

03 HarmonyOS Next仪表盘案例详解(二):进阶篇

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 前言1. 响应式设计1.1 屏幕适配1.2 弹性布局 2. 数据展示与交互2.1 数据卡片渲染2.2 图表区域 3. 事件处理机制3.1 点击事件处理3.2 手势…...

【QT】-易错点笔记-2025-2-7

1,QList<phy_simulator*> pList;为空不能append()追加,要先new,再用 QList<phy_simulator> pList为空时,确实不能调用 append() 方法。原因很简单,QList 是一个类对象,在 C++ 中,指针本身并不代表它指向的对象。因此,当你有一个指向 QList<phy_simulato…...

嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)

目录 一、根文件系统的原理与重要性 二、根文件系统的构成 2.1. 基本目录结构 2.2. 核心组件 2.3. 设备驱动 2.4. 网络工具和协议 2.5. 调试工具 三、根文件系统的制作方法 四、根文件系统的测试 五、构建根文件系统的关键技术 5.1. 最小化构建工具 5.2. 关键配置文…...

electron + vue3 + vite 主进程到渲染进程的单向通信

用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目&#xff1a;https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程&#xff08;单向&#xff09; 以Electron官方文档给出的”主进程主动触发动作&#xff0c;发送内容给渲…...

基于Python实现的智能旅游推荐系统(Django)

基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库&#xff1a;MySQL所用到的知识&#xff1a;Django框架工具&#xff1a;pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页&#xff0c;旅游资讯&#xff0c;景点信息…...

分布式存储—— HBase数据模型 详解

目录 1.3 HBase数据模型 1.3.1 两类数据模型 1.3.2 数据模型的重要概念 1.3.3 数据模型的操作 1.3.4 数据模型的特殊属性 1.3.5 CAP原理与最终一致性 1.3.6 小结 本文章参考、总结于学校教材课本《HBase开发与应用》 1.3 HBase数据模型 在开始学习HBase之前非常…...

使用AI整理知识点--WPF动画核心知识

一、WPF动画基础 1、动画本质 通过随时间改变依赖属性值实现视觉效果&#xff08;如位置、透明度、颜色等&#xff09;。 依赖属性必须支持 DependencyProperty&#xff0c;且需是可动画的&#xff08;如 Double, Color, Point 等&#xff09;。 2、动画三要素 起始值 (Fr…...

计算光学成像与光学计算概论

计算光学成像所涉及研究的内容非常广泛&#xff0c;虽然计算光学成像的研究内容是发散的&#xff0c;但目的都是一致的&#xff1a;如何让相机记录到客观实物更丰富的信息&#xff0c;延伸并扩展人眼的视觉感知。总的来说&#xff0c;计算光学成像现阶段已经取得了很多令人振奋…...

100天精通Python(爬虫篇)——第115天:爬虫在线小工具_Curl转python爬虫代码工具(快速构建初始爬虫代码)

文章目录 一、curl是什么&#xff1f;二、爬虫在线小工具&#xff08;牛逼puls&#xff09;三、实战操作 一、curl是什么&#xff1f; 基本概念&#xff1a;curl 支持多种协议&#xff0c;如 HTTP、HTTPS、FTP、SFTP 等&#xff0c;可用于从服务器获取数据或向服务器发送数据&a…...

点云软件VeloView开发环境搭建与编译

官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程&#xff1a; 安装vs2019&#xff0c;windows sdk&#xff0c;qt5.14.2&#xff08;没安装到5.15.7&#xff09;&#xff0c;git&#xff0c;cmake3.31&#xff0c;python3.7.9&#xff0c;ninja下载放到…...

PHP配置虚拟主机

虚拟主机: 不是真实存在的主机, 因为一台电脑理论上讲只能作为一个网站: 事实上,一个网站是一个文件夹. 在本地开发中&#xff0c;通过虚拟主机配置可以实现多域名独立访问不同项目目录&#xff08;如 www.project1.test 和 www.project2.test&#xff09;&#xff0c;以 ”XAM…...

笔记四:C语言中的文件和文件操作

Faye&#xff1a;只要有正确的伴奏&#xff0c;什么都能变成好旋律。 ---------《寻找天堂》 目录 一、文件介绍 1.1程序文件 1.2 数据文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2.文件的打开和关闭 2.3 文件读取结束的判定 三、 文件的顺序读写 3.1 顺序读写…...

PyTorch中的线性变换:nn.Parameter VS nn.Linear

self.weight nn.Parameter(torch.randn(in_channels, out_channels)) 和 self.linear nn.Linear(in_channels, out_channels) 并不完全一致&#xff0c;尽管它们都可以用于实现线性变换&#xff08;即全连接层&#xff09;&#xff0c;但它们的使用方式和内部实现有所不同。 …...

计算机网络(1) 网络通信基础,协议介绍,通信框架

网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号&#xff0c;也即MAC地址&#xff0c;也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 &#xff08;每一个数可以用四个…...

PHP之常量

在你有别的编程语言的基础下&#xff0c;你想学习PHP&#xff0c;可能要了解的一些关于常量的信息。 PHP中的常量不用指定数据类型&#xff0c;可以使用两次方法定义。 使用const //定义常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…...

苦瓜书盘官网,免费pdf/mobi电子书下载网站

苦瓜书盘&#xff08;kgbook&#xff09;是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台&#xff0c;专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源&#xff0c;涵盖文学、历史、科学、技术等多个领域&#xff0c;旨在打造一个全面的电子书资源库。用…...

通过 Docker openssl 容器生成生成Nginx证书文件

使用 alpine/openssl 镜像生成证书 1. 拉取容器 [rootlocalhost ~]# docker run --rm alpine/openssl version OpenSSL 3.3.3 11 Feb 2025 (Library: OpenSSL 3.3.3 11 Feb 2025)2. 运行 alpine/openssl 生成证书&#xff08;Nginx&#xff09; # 生成1个.key私钥文件&#…...

第四十一:Axios 模型的 get ,post请求

Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式&#xff1a;...

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息

1.聊天框 首先我们完善前端的消息输入框 components下面新建MessageInput组件 import { useState,useRef } from "react" import {X,Image,Send} from "lucide-react"import { useChatStore } from "../store/useChatStore" import toast from…...

Spring Boot面试问答

1. Spring Boot 基础知识 问题 1:什么是Spring Boot?它与Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一个开源框架,旨在简化新Spring应用的初始化和开发过程。与传统的Spring框架相比,Spring Boot提供了以下优势: 自动配置:根据项目依赖自动配置Spring…...

win11编译llama_cpp_python cuda128 RTX30/40/50版本

Geforce 50xx系显卡最低支持cuda128&#xff0c;llama_cpp_python官方源只有cpu版本&#xff0c;没有cuda版本&#xff0c;所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…...

2025-03-07 学习记录--C/C++-C语言 截取字符串的三种方法

C语言 截取字符串 ⭐️ 方法 1&#xff1a;使用 strncpy 函数 &#x1f36d; strncpy 是C标准库中的一个函数&#xff0c;用于从源字符串中复制指定长度的字符到目标字符串中。【详情请查看我的另一篇文章】 示例代码&#xff1a;&#x1f330; #include <stdio.h> #in…...

doris: Oracle

Apache Doris JDBC Catalog 支持通过标准 JDBC 接口连接 Oracle 数据库。本文档介绍如何配置 Oracle 数据库连接。 使用须知​ 要连接到 Oracle 数据库&#xff0c;您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 数据库的 JDBC 驱动程序&#xff0c;您可以从 Maven 仓库…...

【神经网络】python实现神经网络(一)——数据集获取

一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中&#xff0c;我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程&#xff0c;现在我们正式开始进行代码的实现&#xff0c;首先我们来实现第一步的运算过程模拟讲解&#xff1a;正向传导。本次代…...

自学嵌入式第27天------TCP和UDP,URL爬虫

1. TCP和UDP区别 **TCP&#xff08;传输控制协议&#xff09;和UDP&#xff08;用户数据报协议&#xff09;**是两种主要的传输层协议&#xff0c;它们在数据传输方式上有显著区别&#xff1a; 连接性&#xff1a; TCP是面向连接的协议&#xff0c;通信前需通过三次握手建立连…...

【虚拟化】Docker Desktop 架构简介

在阅读前您需要了解 docker 架构&#xff1a;Docker architecture WSL 技术&#xff1a;什么是 WSL 2 1.Hyper-V backend 我们知道&#xff0c;Docker Desktop 最开始的架构的后端是采用的 Hyper-V。 Docker daemon (dockerd) 运行在一个 Linux distro (LinuxKit build) 中&…...

C#程序加密与解密Demo程序示例

目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 ​编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…...

200W数据需要去重,如何优化?

优化去重逻辑的时间取决于多个因素&#xff0c;包括数据量、数据结构、硬件性能&#xff08;CPU、内存&#xff09;、去重算法的实现方式等。以下是对优化去重逻辑的详细分析和预期优化效果&#xff1a; 1. 去重逻辑的性能瓶颈 时间复杂度&#xff1a;使用HashSet去重的时间复…...

理解 UDP 协议与实战:Android 使用 UDP 发送和接收消息

一、UDP 协议概述 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一个无连接的网络通信协议。与 TCP 不同&#xff0c;UDP 不建立连接&#xff0c;不保证数据的顺序和完整性。它的特点是简单、高效&#xff0c;适用于实时性要求较高、对数据…...

7V 至 30V 的超宽 VIN 输入范围,转换效率高达 96%的WD5030

WD5030 具备 7V 至 30V 的超宽 VIN 输入范围&#xff0c;这一特性使其能够适应多种不同电压等级的供电环境&#xff0c;无论是在工业设备中常见的较高电压输入&#xff0c;还是在一些便携式设备经过初步升压后的电压&#xff0c;WD5030 都能轻松应对&#xff0c;极大地拓展了应…...

基于 LeNet 网络的 MNIST 数据集图像分类

1.LeNet的原始实验数据集MNIST 名称&#xff1a;MNIST手写数字数据集 数据类型&#xff1a;灰度图 &#xff08;一通道&#xff09; 图像大小&#xff1a;28*28 类别数&#xff1a;10类&#xff08;数字0-9&#xff09; 1.通过torchvision.datasets.MNIST下载并保存到本地…...

智能体开发:推理-行动(ReAct)思维链提示

人类在处理一个需要多个步骤才能完成任务时&#xff0c;显著特点是能够将言语推理&#xff08;内心独白&#xff09;和实际行动融合在一起&#xff0c;在面对陌生或不确定的情况时通过这种方法学习新知识&#xff0c;做出决策&#xff0c;并执行&#xff0c;从而应对复杂的任务…...

Android Native 之 文件系统挂载

一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知&#xff0c;init进程为android系统的第一个进程&#xff0c;也是native世界的开端&#xff0c;要想让整个android世界能够稳定的运行&#xff0c;文件系统的创建和初始化是必不可少的&#xff…...