Jackson详解

news2024/11/13 15:22:27

文章目录

  • 一、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、快速入门

 @Test
 public 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);
    // 序列化byt
    byte[] 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 {
    @JsonIgnore
    private Integer age;
    @JsonIgnore
    private 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> {
    @Override
    public 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.coloradmin.cn/o/1940390.html

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

相关文章

Nexus3 批量上传 jar 包、pom文件

Nexus3 Maven 私服搭建及各种使用 详见**Maven私服搭建及各种使用汇总2020** Maven 配置 Nexus 私服 在 Maven 项目中配置 Nexus 私服&#xff0c;需要在项目的 pom.xml 或 maven 的 settings.xml 文件中添加 Nexus 仓库的配置。 示例&#xff1a; 以下是一个项目的 pom.xml…

word 设置目录中英文字母大写改为小写

选中目录右击“字体”&#xff0c;设置“小型大写字母”。

【Django+Vue3 线上教育平台项目实战】Celery赋能:优化订单超时处理与自动化定时任务调度

文章目录 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6;一、Celery⭐1.基本概念及介绍:✨2.使用步骤&#x1f4ab; 二、订单超时 取消订单&#xff08;Celery&#xff09;&#x1f525;具体实现流程&#x1f4d6; 前言⭐✨&#x1f4ab;&#x1f525;&#x1f4d6; 在构建复…

图解 Hadoop 架构 |Yarn、MapReduce

Hadoop Hadoop 是什么 Hadoop 是由 Apache 基金会所开发&#xff0c;维护的分布式系统基础架构主要解决海量数据的存储和海量数据的分析计算问题广义上来说&#xff0c;Hadoop 通常是指一个更广泛的概念——Hadoop 生态圈&#xff0c;包括 MapReduce&#xff0c;HDFS&#xf…

Python面试宝典第16题:跳跃游戏

题目 给你一个非负整数数组 nums &#xff0c;你最初位于数组的第一个下标 &#xff0c;数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true。否则&#xff0c;返回 false。 示例 1&#xff1a; 输…

Lowpoly Style Alpine Woodlands Environment(高山林地)

v1.1中的新增功能:添加了地形的额外网格。 使用此资产包构建您自己的山地或林地级别和景观!还包括一个demoscene。该包包含许多资产:植物、岩石、山脉、树木、建筑、营地和帐篷、墙壁、粒子效果等等。 性能:所有东西都共享一种材质和一种纹理,因此可以将所有东西分批在一起…

0401-403组合逻辑电路的分析设计竞争冒险

组合逻辑电路的分析设计&竞争冒险 4.组合逻辑电路1.目录2.教学基本要求3.序 关于组合逻辑电路 4.1组合逻辑电路分析与设计一、组合逻辑电路分析二、组合逻辑电路的分析步骤&#xff1a;三、组合逻辑电路的分析举例例1 奇校验电路例2.对输入的二进制求反码例3.一个工厂发电的…

git使用、git与idea结合、gitee、gitlab

本文章基于黑马程序javase模块中的"git"部分 先言:git在集成idea中,不同版本的idea中页面显示不同,操作时更注重基于选项的文字;git基于命令操作参考文档实现即可,idea工具继承使用重点掌握 1.git概述 git是目前世界上最先进的分布式文件版本控制系统 分布式:将…

2024年steam好玩的新游:《哈迪斯2》《雨中冒险: 回归》等

今天已经有不少新游上线&#xff0c;下面为大家整理了2024年好玩的steam游戏&#xff0c;一起来看看。 2024值得一玩的新游 1、《哈迪斯2》 哈迪斯2&#xff08;Hades II&#xff09;是Supergiant Games继其广受好评的作品《哈迪斯》之后开发的一款动作角色扮演游戏。 在《哈…

纯净IP的判断标准及代理深度分析

今天&#xff0c;我们测评团队将带大家深入探讨纯净IP的判断标准&#xff0c;并通过实测数据&#xff0c;对极光静态代理与独享云创这两家服务商进行深度剖析&#xff0c;为你揭秘如何挑选那些真正值得信赖的IP代理服务。 一、纯净IP的判断标准 历史记录检查&#xff1a;一个好…

@Resource注解 和 @Autowired 注解的区别!

Resource注解 和 Autowired 注解的区别! 前言: 实习时候第一次拉取了企业级代码(微服务),发现基本上都是Resource注解,自己之前平时没仔细思考 就是按照自己的习惯用的Autowired,平时开发也是单体架构的系统. 理解: Autowired Autowired是spring提供的一个注解,默认是根据类型…

[RL] 马尔可夫决策过程基础

文章结构 目录 一、马尔可夫过程 马尔可夫性质 二、马尔可夫奖励过程 回报&#xff08;Return&#xff09; 贝尔曼方程&#xff08;Bellman equation&#xff09; 贝尔曼方程解析解 蒙特卡洛方法​ 马尔可夫决策过程​ MDP和马尔可夫过程/马尔可夫奖励过程的区别 马…

循环机制(event loop)之宏任务和微任务

一、前言 js任务分为同步任务和异步任务&#xff0c;异步任务又分为宏任务和微任务&#xff0c;其中异步任务属于耗时的任务。 二、宏任务和微任务有哪些&#xff1f; 宏任务&#xff1a;整体代码script、setTimeout、setInterval、setImmediate&#xff08;Node.js&#xff…

nginx conf.d 模块化配置

文章目录 前言nginx conf.d 模块化配置1. 概述2. 优势3. 配置 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实在白嫖的话&#xff0c…

关卡1-2:Python关卡

关卡1-2&#xff1a;Python关卡 一、python实现wordcount二、通过本地VSCODE连接internStudio与debug2.1使用本地的VSCODE连接InternStudio2.2 debug插件安装2.3 debug进行时2.3.1 代码准备2.3.2 选择python解释器2.3.3 打断点 一、python实现wordcount 采用python实现经典任务…

【C++】红黑树模拟实现STL库中的map与set

目录 改造红黑树 红黑树的迭代器 map的模拟实现 set的模拟实现 在上一篇博客中&#xff0c;我们实现了红黑树&#xff0c;但是红黑树节点中的值是pair<K,V> _kv形式&#xff0c;这种红黑树适用于map的底层&#xff0c;那么如果我们想要红黑树节点中的值是key的形式&a…

神经网络处理器模拟器的一点思考

一 神经网络处理器 通常基于FPGA的神经网络处理器进行部署某种网络&#xff0c;考虑的因素较多&#xff0c;具体包括网络模型的不同&#xff0c;涵盖不同的算子、激活函数、调度策略等等&#xff1b;具体硬件实现&#xff0c;涉及神经网络处理器并行度、硬件资源消耗&#xff0…

【C++高阶】哈希函数底层原理探索:从算法设计到实现优化

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;模拟实现 map与set &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀哈希 &#x1f4da;1. unord…

MinerU、Magic-PDF、Magic-Doc

文章目录 一、关于 MinerU二、Magic-PDF1、简介2、项目全景3、流程图4、子模块仓库 三、Magic-PDF 上手指南1、配置要求2、安装配置1. 安装Magic-PDF2. 下载模型权重文件3. 拷贝配置文件并进行配置4. 使用CUDA或MPS加速推理CUDAMPS 3、使用说明1) 通过命令行使用直接使用更多用…

鑫创SSS1700USB音频桥芯片USB转IIS芯片

鑫创SSS1700支持IIC初始外部编&#xff08;EEPROM选项),两线串行总线&#xff08;I2C总线&#xff09;用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM&#xff08;24C02~24C16&#xff09;接口&#xff0c;用于客户特定的USB视频、PID、…