开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
Computer Science

Docker 使用 Fedora 镜像

Fedora 在 Docker 中的使用也非常简单,直接使用命令 docker run -it fedora:latest bash 就可以 pull 到本地的容器中并且运行。 C:\Users\yhu>docker run -it fedora:latest bash Unable to find image 'fedora:latest' locally latest: Pulling from library/fedora d4df0db66c89: Pull complete Digest: sha256:5ce8497aeea599bf6b54ab3979133923d82aaa4f6ca5ced1812611b197c79eb0 Status: Downloaded newer image for fedora:latest [root@eba5d114176c /]# cat /etc/redhat-release Fedora release 40 (Forty) [root@eba5d114176c /]#     因为 CentOS 的版本已经不再提供支持了,如果还想使用 RHEL 的版本的话,Fedora 可能目前可以选择的一个版本部署到服务器上。     当前操作系统的 Docker 镜像版本在 221 MB 左右。   https://www.isharkfly.com/t/docker-fedora/15743

2024年05月14日 0Comments 443Browse 0Like Read more
Computer Science

Docker 的 Ubuntu 操作系统镜像

Debian 和 Ubuntu 都是目前较为流行的 Debian 系列 的服务器操作系统,十分适合研发场景。     Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。 Linux 发行版虽然有数百个,但其中只有少数是从零开始的独立发行版。 Debian、Arch、Red Hat 是其中几个不派生于其它发行版的使用最广的发行版。 Ubuntu 源自 Debian。这意味着 Ubuntu 使用与 Debian 相同的 APT 包管理系统,并共享来自 Debian 库中的大量包和库。它建立在 Debian 基础架构上。 Docker Hub 上提供了官方镜像,国内各大容器云服务也基本都提供了相应的支持。 如果使用过树莓派的话,那么安装的操作系统就为 Debian,Ubuntu 被广泛在开发环境中使用,例如 Windows 使用的 WSL 系统,也是使用的 Ubuntu。 在实际使用的时候,我们会看到 Ubuntu 使用的情况比 Debian 更多。 软件更新 Debian 更关注稳定性,这意味着它并不总是使用最新版本的软件。例如,最新的 Debian 11 用的 GNOME 版本为 3.38,并不是最新版的 GNOME 3.40。     对于 GIMP、LibreOffice 等其它软件也是如此。这是你必须对 Debian 做出的妥协。这就是“Debian stable = Debian stale”笑话在 Linux 社区流行的原因。 Ubuntu LTS 版本也关注稳定性。但是它们通常拥有较新版本的常见软件。 你应该注意,对于某些软件,从开发者的仓库安装也是一种选择。例如,如果你想要安装最新版的 Docker,你可以在 Debian 和 Ubuntu 中添加 Docker 仓库。 总体来说,相比较于 Ubuntu ,Debian 稳定版的软件版本会更旧。 Debian 系统简介 Debian 是由 GPL 和其他自由软件许可协议授权的自由软件组成的操作系统,由 Debian 计划(Debian Project) 组织维护。Debian 计划 是一个独立的、分散的组织,由 3000 人志愿者组成,接受世界多个非盈利组织的资金支持,Software in the Public Interest 提供支持并持有商标作为保护机构。 Debian 以其坚守 Unix 和自由软件的精神,以及其给予用户的众多选择而闻名。现时 Debian 包括了超过 25,000 个软件包并支持 12 个计算机系统结构。 Debian 作为一个大的系统组织框架,其下有多种不同操作系统核心的分支计划,主要为采用 Linux 核心的 Debian GNU/Linux 系统,其他还有采用 GNU Hurd 核心的 Debian GNU/Hurd 系统、采用 FreeBSD 核心的 Debian GNU/kFreeBSD 系统,以及采用 NetBSD 核心的 Debian GNU/NetBSD 系统。甚至还有利用 Debian 的系统架构和工具,采用 OpenSolaris 核心构建而成的 Nexenta OS 系统。 在这些 Debian 系统中,以采用 Linux 核心的 Debian GNU/Linux 最为著名。 众多的 Linux 发行版,例如 Ubuntu、Knoppix 和 Linspire 及 Xandros 等,都基于 Debian GNU/Linux。 Debian 是一个自由的操作系统,由 Debian 计划开发和维护。Debian 是一个自由的 Linux 发行版,添加了数以千计的应用程序以满足用户的需要。 使用 Debian 官方镜像 官方提供了大家熟知的 debian 镜像以及面向科研领域的 neurodebian 镜像。 NeuroDebian为Debian操作系统以及Ubuntu等衍生产品提供了大量流行的神经科学研究软件。 热门套餐包括AFNI,FSL,PyMVPA,等等。 可以使用 docker run 直接运行 Debian 镜像。 $ docker run -it debian bash Unable to find image 'debian:latest' locally latest: Pulling from library/debian 1468e7ff95fc: Pull complete Digest: sha256:1aadfee8d292f64b045adb830f8a58bfacc15789ae5f489a0fedcd517a862cb9 Status: Downloaded newer image for debian:latest root@bd3f8b3110da:/# cat /etc/issue Debian GNU/Linux 12 \n \l root@bd3f8b3110da:/# Debian 镜像很适合作为基础镜像,构建自定义镜像。     但实际使用上,我们使用 Ubuntu 来作为基础镜像的可能性更高一些。 如果通过 Windows 的 Docker 管理软件,可以看到运行的 Docker 镜像。 Ubuntu 系统简介 Ubuntu(国际音标:/ʊˈbʊntuː/,uu-BUUN-too)是基于Debian,以桌面应用为主的Linux发行版。Ubuntu有三个正式版本,包括桌面版、服务器版及用于物联网设备和机器人的Core版。前述三个版本既能安装于实体电脑,也能安装于虚拟电脑。从17.10版本开始,Ubuntu以GNOME为默认桌面环境。 Ubuntu是著名的Linux发行版之一,也是目前最多用户的Linux版本。Ubuntu每六个月(即每年的四月与十月)发布一个新版本,长期支持(LTS)版本每两年发布一次。普通版本一般只支持9个月,但LTS版本一般能提供5年的支持。 Ubuntu由英国肯诺有限公司发布,他们提供商业支持。它是基于自由软件,其名称来自非洲南部祖鲁语或科萨语的“Ubuntu”一词(译为乌班图),意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观。 科能软件有限公司通过销售与Ubuntu相关的技术支持和其他服务来产生收益。Ubuntu项目公开承诺开源软件开发的原则;鼓励人们使用自由软件,研究它的运作原理,改进和分发。 使用 Ubuntu 官方镜像 下面以 ubuntu:24.04 为例,演示如何使用该镜像安装一些常用软件。 首先使用 -ti 参数启动容器,登录 bash,查看 ubuntu 的发行版本号。 PS C:\WorkDir\Beth-Israel-Lahey-Health\Source-Code\SVN> docker run -ti ubuntu:24.04 /bin/bash Unable to find image 'ubuntu:24.04' locally 24.04: Pulling from library/ubuntu 49b384cc7b4a: Pull complete Digest: sha256:3f85b7caad41a95462cf5b787d8a04604c8262cdcdf9a472b8c52ef83375fe15 Status: Downloaded newer image for ubuntu:24.04 root@0f38683a6f14:/# cat /etc/os-release PRETTY_NAME="Ubuntu 24.04 LTS" NAME="Ubuntu" VERSION_ID="24.04" VERSION="24.04 LTS (Noble Numbat)" VERSION_CODENAME=noble ID=ubuntu ID_LIKE=debian HOME_URL="https://www.ubuntu.com/" SUPPORT_URL="https://help.ubuntu.com/" BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/" PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" UBUNTU_CODENAME=noble LOGO=ubuntu-logo root@0f38683a6f14:/# 当试图直接使用 apt 安装一个软件的时候,会提示 E: Unable to locate package curl。 root@0f38683a6f14:/# apt install curl Reading package lists... Done Building dependency tree... Done Reading…

2024年05月13日 0Comments 542Browse 0Like Read more
Computer Science

Busybox 在 Docker 中的部署和启动

可以使用 docker pull 指令下载 busybox:latest 镜像: PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb Status: Downloaded newer image for busybox:latest docker.io/library/busybox:latest What's Next? View a summary of image vulnerabilities and recommendations → docker scout quickview busybox:latest PS C:\Users\yhu> 下载后,可以看到 busybox 镜像只有 4.26 MB: PS C:\Users\yhu> docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE repo-docker.isharkfly.com/docker-hub/visatrack latest a329341dbaeb 3 days ago 522MB repo-docker.isharkfly.com/docker-hub/visatrack <none> f5f9d8b3b410 3 days ago 522MB alpine/git latest 80ed206c002b 7 days ago 50.4MB data-mq-service 0.0.1-SNAPSHOT 7eb277a365d6 3 weeks ago 475MB docsify-docs 0.0.1 32062033284a 6 weeks ago 1.13GB <none> <none> 0ebfbefe1d52 6 weeks ago 1.13GB alpine latest 05455a08881e 3 months ago 7.38MB zchub-crawler latest b20aa408fe8f 7 months ago 1.6GB mq-service 0.0.1-SNAPSHOT 308dd50eb67a 7 months ago 441MB reso-web-api-reference-server-odata-manager-app latest 27cdaae03879 8 months ago 441MB reso-builder latest cabba9a35a22 8 months ago 1.47GB busybox latest 65ad0d468eb1 11 months ago 4.26MB tutor-service 0.0.1-SNAPSHOT 20d2f52a1fc4 13 months ago 521MB sharkfly-wechat-service 0.0.1-SNAPSHOT 0d3e7843994e 13 months ago 465MB eclipse-temurin 17-jdk-alpine 9a0a4e74d117 13 months ago 358MB rabbitmq 3.11-management 04a3a28a368b 13 months ago 255MB framework-spring-docker 0.0.1-SNAPSHOT 42e51829e8c7 15 months ago 379MB adoptopenjdk/openjdk11-openj9 alpine b533cd6150ba 15 months ago 379MB mysql/mysql-server latest 1d9c2219ff69 16 months ago 496MB docker101tutorial latest e60bd4e10534 17 months ago 47MB alpine/git <none> 22d84a66cda4 17 months ago 43.6MB PS C:\Users\yhu>     如果只说是大小来说,Alpine 也大不了多少,但 Alpine 提供了更多的功能。 这也就是为什么 Docker 官方切换到 Alpine 的原因。   https://www.isharkfly.com/t/busybox-docker/15732

2024年05月13日 0Comments 729Browse 0Like Read more
Computer Science

Docker 的 Busybox 操作系统镜像

BusyBox是一个遵循GPL协议、以自由软件形式发行的应用程序。 Busybox在单一的可执行文件中提供了精简的Unix工具集,可运行于多款POSIX环境的操作系统,例如Linux(包括Android)、Hurd、FreeBSD等等。 由于BusyBox可执行文件的文件比较小,使得它非常适合使用于嵌入式系统。 作者将BusyBox称为“嵌入式Linux的瑞士军刀”。     在以前,Docker 官方为了压缩容量,保证容器的启用,其实都在使用 busybox,但后期,Docker 官方开始使用 Alpine 来替代 busybox。 获取官方镜像 可以使用 docker pull 指令下载 busybox:latest 镜像: PS C:\Users\yhu> docker pull busybox:latest latest: Pulling from library/busybox ec562eabd705: Pull complete Digest: sha256:5eef5ed34e1e1ff0a4ae850395cbf665c4de6b4b83a32a0bc7bcb998e24e7bbb Status: Downloaded newer image for busybox:latest docker.io/library/busybox:latest What's Next? View a summary of image vulnerabilities and recommendations → docker scout quickview busybox:latest PS C:\Users\yhu> 下载后,可以看到 busybox 镜像只有 4.26 MB: PS C:\Users\yhu> docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE repo-docker.isharkfly.com/docker-hub/visatrack latest a329341dbaeb 3 days ago 522MB repo-docker.isharkfly.com/docker-hub/visatrack <none> f5f9d8b3b410 3 days ago 522MB alpine/git latest 80ed206c002b 7 days ago 50.4MB data-mq-service 0.0.1-SNAPSHOT 7eb277a365d6 3 weeks ago 475MB docsify-docs 0.0.1 32062033284a 6 weeks ago 1.13GB <none> <none> 0ebfbefe1d52 6 weeks ago 1.13GB alpine latest 05455a08881e 3 months ago 7.38MB zchub-crawler latest b20aa408fe8f 7 months ago 1.6GB mq-service 0.0.1-SNAPSHOT 308dd50eb67a 7 months ago 441MB reso-web-api-reference-server-odata-manager-app latest 27cdaae03879 8 months ago 441MB reso-builder latest cabba9a35a22 8 months ago 1.47GB busybox latest 65ad0d468eb1 11 months ago 4.26MB tutor-service 0.0.1-SNAPSHOT 20d2f52a1fc4 13 months ago 521MB sharkfly-wechat-service 0.0.1-SNAPSHOT 0d3e7843994e 13 months ago 465MB eclipse-temurin 17-jdk-alpine 9a0a4e74d117 13 months ago 358MB rabbitmq 3.11-management 04a3a28a368b 13 months ago 255MB framework-spring-docker 0.0.1-SNAPSHOT 42e51829e8c7 15 months ago 379MB adoptopenjdk/openjdk11-openj9 alpine b533cd6150ba 15 months ago 379MB mysql/mysql-server latest 1d9c2219ff69 16 months ago 496MB docker101tutorial latest e60bd4e10534 17 months ago 47MB alpine/git <none> 22d84a66cda4 17 months ago 43.6MB PS C:\Users\yhu> 如果只说是大小来说,Alpine 也大不了多少,但 Alpine 提供了更多的功能。 这也就是为什么 Docker 官方切换到 Alpine 的原因。 运行 busybox 启动一个 busybox 容器,并在容器中执行 grep 命令。 从启动的速度来看,那就是几乎是光速了。 PS C:\Users\yhu> docker run -it busybox / # grep BusyBox v1.36.1 (2023-05-18 22:34:17 UTC) multi-call binary. Usage: grep [-HhnlLoqvsrRiwFE] [-m N] [-A|B|C N] { PATTERN | -e PATTERN... | -f FILE...…

2024年05月13日 0Comments 862Browse 0Like Read more
Computer Science

Docker 直接运行一个 Alpine 镜像

由于镜像很小,下载时间往往很短,读者可以直接使用 docker run 指令直接运行一个 Alpine 容器,并指定运行的 Linux 指令,例如: PS C:\Users\yhu> docker run alpine echo '123' Unable to find image 'alpine:latest' locally latest: Pulling from library/alpine 4abcf2066143: Already exists Digest: sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b Status: Downloaded newer image for alpine:latest 123     如果通过容器管理查看容器的大小,也只有 50MB。 如果再加个 JDK 那可比这个大多了,操作系统的大小还不如一个 JDK。   https://www.isharkfly.com/t/docker-alpine/15729

2024年05月12日 0Comments 406Browse 0Like Read more
Computer Science

UA 的网站这是大改版

UA 这几天在频繁推送更新,这网站这次是大改版了。 字体都全部都换成了 : "NeuePlakforUnited-Rg","Noto Sans","Arial",sans-serif   这回玩得大,还专门找做字体的公司给做了一个 NeuePlakforUnited-Rg 字体。     现在的公司都已经不再局限使用已有的字体了,都开始要用自定义字体了。   https://www.isharkfly.com/t/ua/15726

2024年05月11日 0Comments 507Browse 0Like Read more
Computer Science

知道为什么要么用 GitHub 要么自己装个博客了吗

曾经有人在知乎上问过,为什么要自己弄个博客或者用 Git 吗? 看看这个应该就知道了吧。     因为有很长一段时间都没有在 OSCHINA 上发布博客了,因为老是审核不通过。 账号也大半年也没有登录过了,今天登录下就这样了。 你说有什么问题,提前邮件通知下也行呀,辛亏也就只是在上面看看热闹。 https://www.isharkfly.com/t/github/15725

2024年05月11日 0Comments 385Browse 0Like Read more
Computer Science

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M,GitHub 是会被限制推送到仓库中的,大概率情况会显示下面的错误: remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b remote: error: See https://gh.io/lfs for more information. remote: error: File Ektron_Prod/App_Data/GeoIPOrg.dat is 139.96 MB; this exceeds GitHub's file size limit of 100.00 MB remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com. 对于上面的问题,我们需要使用 LFS 服务。 找到合并信息 运行下面的代命令,找到我们合并后仓库中的合并信息: git lfs migrate info --everything --above="100MB" 这个命令将会找到在当前仓库中有那些文件的扩展名大小超过 100MB。 我们得到了下面的输出。 migrate: Sorting commits: ..., done. migrate: Examining commits: 100% (17/17), done. *.dat 587 MB 4/13 files 31% LFS Objects 0 B 0/4517 files 0% 提交处理 从上面的输出中,我们看到了 .dat 文件有超过 100 MB。 下一步,我们需要运行命令对针对这个文件的提交进行处理。 git lfs migrate import --everything --include="*.dat" 随后,控制台输出: migrate: Sorting commits: ..., done. migrate: Rewriting commits: 100% (17/17), done. master 7f1f2a07b4dc972e6243984675bd28a3ea15b212 -> 3de8026c759fe6a22199d4df7c640e1bbd1b28e0 migrate: Updating refs: ..., done. migrate: checkout: ..., done. 使用命令进行提交 运行下面的命令,将本地代码仓库提交到远程: git push --all origin -u 当然,在这个提交之前,需要设置远程仓库的地址,这个你可以通过修改 config 文件进行修改。 再次确认所有 LFS 文件提交 在合并的过程中,可能会有些大型文件没有提交到 LSF 上面。 所以需要运行下下面的命令,再次确认所有的 LSF 文件被提交。 git lfs push origin --all https://www.isharkfly.com/t/svn-git-100-m-push/15723

2024年05月11日 0Comments 365Browse 0Like Read more
Computer Science

Jackson 中使用 Optional

介绍 在本文中,我们会对 Optional 类进行一些说明,并且会解释下如果在使用 Optional 类的时候可能在 Jackson 中进行序列化和反序列化的过程中出现的问题。 针对上面的问题,本文会将会介绍在 Jackson 中如何处理 Optional 对象,和如果 Optional 对象可能出现潜在的 Null 的解决方案。 问题概览 首先让我们来看看如果使用 Jackson 来对 Optional 数据类型进行序列化和反序列化中出现的问题。 Maven 依赖 针对 Jackson,我们可以使用最新的版本。 当我们对本文进行更新的时候,jackson-core 的最新版本为 2.17.0。 <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.13.3</version> </dependency> 定义 Book 对象 随后让我们来定义一个 Book 对象,在 Book 对象中,我们有一个使用 Optional 的字段。 当然在这个 Book 对象中,我们还需要添加 Getter 和 Setter 方法,在文章中,我们就省略到这些方法了。 public class Book { private String title; private Optional<String> subTitle; } 在的对数据对象进行初始化的时候,我们需要注意对 Optional 对象设置值的方式,因为不同的值会影响序列化和反序列化的情况。 序列化 让我们先来实例化 Book 这个对象: Book book = new Book(); book.setTitle("Oliver Twist"); book.setSubTitle(Optional.of("The Parish Boy's Progress")); 随后,我们使用 Jackson 的 ObjectMapper 方法来对实例化后的对象进行序列化,我们使用下面的代码来进行序列化: String result = mapper.writeValueAsString(book); 从输出的字段中,我们可以看到输出的字符串内容中并没有输出具体的值,而是输出为下面的内容: {"title":"Oliver Twist","subTitle":{"present":true}} 尽管上面的输出看起来有点奇怪,但是上面的输出却是正确的情况,因为这个和 Optional 的特性是有关的。 方法 isPresent() Optional 的 public getter 方法,这就意味着在序列化的时候基于我们对象中存储的具体的值,Jackson 将会输出 True 或者 False 。 这是 Jackson 当前正确的输出方式。 但,我们可能考虑在输出的时候输出具体的值,至于怎么输出这个具体的值的方法,我们在后续的解决方案中提出。 反序列化 现在,让我们使用上面的代码来对对象数据进行反序列化,考察使用下面的代码: @Test(expected = JsonMappingException.class) public void givenFieldWithValue_whenDeserializing_thenThrowException String bookJson = "{ \"title\": \"Oliver Twist\", \"subTitle\": \"foo\" }"; Book result = mapper.readValue(bookJson, Book.class); } 当上面的代码运行的时候将会提示下面的错误信息: com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.util.Optional` (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('foo') at [Source: (String)"{ "title": "Oliver Twist", "subTitle": "foo" }"; line: 1, column: 40] (through reference chain: com.ossez.jackson.optionalwithjackson.Book["subTitle"]) 上面的错误信息针对 Jackson 来说是正确的,因为 Jackson 是需要一个构造方法来把 subtitle 参数的值来对 Optional 对象进行数据初始化。 解决方案 我们希望的是 Optional 对象应该把一个空的数据设置为 null,如果不是空的数据,Optional 应该使用值来进行处理。 针对上面的要求,Jackson 已经提供了解决方案,Jackson 针对 JDK8 的新增模块设置了一系列数据类型,这里就包括了 Optional。 Maven 依赖 首先,我们需要使用针对 JDK 8 使用的依赖,这个依赖的名称为:jackson-datatype-jdk8 <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jdk8</artifactId> <version>2.17.0</version> </dependency> 现在,我们需要把上面的依赖注册到 ObjectMapper: ObjectMapper mapper = new ObjectMapper(); mapper.registerModule(new Jdk8Module()); 或者上面的 2 句话也可以简化成 1 句话: ObjectMapper mapper = new ObjectMapper().registerModule(new Jdk8Module()); 序列化 现在,让我们来进行测试。 让我们再次使用上面的代码来对 Book 这个对象进行序列化和反序列化,然后我们在对输出的字符串进行查看。 Book book = new Book(); book.setTitle("Oliver Twist"); book.setSubTitle(Optional.of("The Parish Boy's Progress")); String serializedBook = mapper.writeValueAsString(book); assertThat(from(serializedBook).getString("subTitle")) .isEqualTo("The Parish Boy's Progress"); 如果我们尝试序列化一个空的 Book 对象的话,那么 Optional 字段中存储的数据为 null。 book.setSubTitle(Optional.empty());…

2024年05月06日 0Comments 444Browse 0Like Read more
Computer Science

Java Jackson-jr 库使用介绍

介绍 Jackson-jr 是一个轻量级的Java JSON 处理库。这个库被设计用来替代 Jackson 的复杂性。对比 Jackson 的复杂 API,Jackson-jr 的启动速度更快,包大小更小。 虽然Jackson databind(如ObjectMapper)是通用数据绑定的良好选择,但它的占用空间(Jar包大小)和启动开销在某些领域可能存在问题:比如移动端,特别是对于轻量使用(读或写)。这种情况下,完整的Jackson API是让人接受不了的。 由于所有这些原因,Jackson 官方决定创建一个更简单、更小的库:Jackson-jr。它仍旧构建在 Streaming API 之上,但不依赖于 databind 和annotation。因此,它的大小(jar和运行时内存使用)要小得多,它的API非常紧凑,所以适合APP等移动端。 它仅仅只依赖了 jackson-core 模块,所以体积上控制得非常的好。Jackson 单单三大核心模块大小合计1700KB左右(320 + 70 + 1370)。而Jackson-jr的体积控制在了95KB(就算加上core模块的320也不到500KB)。 针对实际开发的情况,很多时候我们只需要对 JSON 数据进行读取和写入,至于一些过于复杂和强大的属性,我们可能也用不上,因此针对一些 JSON 数据使用场景比较单一的情况,Jackson-jr 就显得更有优势了。 所以,Jackson-jr 的主要情况就是在针对 JSON 格式的读写上面,如果你只需要简单的读和些,Jackson-jr 通常是你的一个选择。 在本文中,我们对 Jackson-jr 的简单使用进行一些说明和示例。 开始使用 Jackson-jr Jackson-jr 提供的是轻量和高效的 JSON 处理模块。所以 Jackson-jr 针对 JSON 数据结构只提供了简单的数据读取和写入功能。 当然 Jackson-jr 是可以处理对象和数组的。 在开始使用 Jackson-jr 之前,我们需要把需要的包添加到 Maven 项目的 pom 文件中。 当前的可以使用的最新版本为:2.17.0 <dependency> <groupId>com.fasterxml.jackson.jr</groupId> <artifactId>jackson-jr-all</artifactId> <version>2.17.0</version> </dependency> XML 针对 Gradle 可以使用不同的表达方式,唯一需要注意一点的就是版本号。 处理 JSON 对象 尽管我们是使用 Jackson-jr 来处理 JSON 字符串,和 Jackson 一样,字符串也会被处理成为 JSON 对象:每一个 JSON 实例是不可变(immutable )的,同时也是线程安全的。 正是因为有上面的特性,我们可以在多线程程序,单例模式,Spring Bean 中安全的使用创建的 JSON 对象。 创建 JSON 对象和数组 针对创建的 JSON 对象,我们可以使用类似 LinkedHashMap 来创建对象,对于数组,我们就可以用我们常用的 ArrayList。 因为 JSON 对象使用的是 LinkedHashMap,所以我们可以利用 Map 的特性,使用  LinkedHashMap.put() 方法来 Push 数据到 Map 中。 @Test public void createJsonStringTest() throws IOException { System.out.println(JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT) .asString(new LinkedHashMap<String, Object>() {{ put("name", "John Doe"); put("age", 30); }})); } Java Jackson-jr Composer Jackson-jr 同时还提供了 Composer 的这个创建方法,这个创建方法更加直接。 你可以按照你的想法直接进行定义和输出,在这之前,我们通常需要定义一个对象,然后对对象进行完成数据后再输出,对于一些简单的 JSON 格式。我们可以不用定义对象了,而是直接使用。 public static String jsonComposer() throws IOException { return JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT) .composeString() .startObject() .startArrayField("objectArray") .startObject() .put("name", "name1") .put("age", 11) .end() .startObject() .put("name", "name2") .put("age", 12) .end() .end() .startArrayField("array") .add(1) .add(2) .add(3) .end() .startObjectField("object") .put("name", "name3") .put("age", 13) .end() .put("last", true) .end() .finish(); } Java 运行上面的程序后,程序将会输出: { "objectArray" : [ { "name" : "name1", "age" : 11 }, { "name" : "name2", "age" : 12 } ], "array" : [ 1, 2, 3 ], "object" : { "name" : "name3", "age" : 13 }, "last" : true } Plain text 序列化和反序列化 Jackson-jr 可以让我们非常容易的把 Java 对象进行序列化,同时也能够非常容易的让我们从 JSON 字符串中读取为 Java 对象。 在对对象进行读写的时候,我们也可以对读写的属性进行定义,例如对输出的文本进行格式化或者使用自定义的日期属性进行输出,然后再从 Java 对象中写入到 String 字符串。 Jackson-jr 同时也能够支持复杂的数据结构,例如对象嵌套和数组等。通过对我们对象的关联关系的定义,我们可以让 JSON 字符串在进行反序列化序列化的时候完成对象映射,对于 Java 到 String 字符串的输出,其实也是一样。 // Serialization String json = JSON.std.with(JSON.Feature.PRETTY_PRINT_OUTPUT) .asString(person); // Deserialization…

2024年05月04日 0Comments 532Browse 0Like Read more
1…4849505152…303
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (517)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1