18.Spring Boot中的JSON技术

【Spring Boot 3】【JSON】读取JSON文件 本文介绍开发Spring Boot应用如何读取resources目录下JSON格式文件的内容。有些情况下应用需要额外加载一些配置信息,这些配置信息既不在或bootstrap配置文件中,也不在由或bootstrap配置文件包含(include)的其他配置文件中,而是存储在一些额外的JSON格式文件中,需要应用启动时加载这些配置信息。本文演示了使用Spring Boot默认的Jackson框架读取JSON的方法,也可以切换为Fastjson2、GSON等其他框架; 阅读详情

Spring Boot中的JSON技术

平日里在项目中处理JSON一般用的都是阿里巴巴的Fastjson,后来发现使用Spring Boot内置的Jackson来完成JSON的序列化和反序列化操作也挺方便。Jackson不但可以完成简单的序列化和反序列化操作,也能实现复杂的个性化的序列化和反序列化操作。

自定义ObjectMapper

我们都知道,在Spring中使用@ResponseBody注解可以将方法返回的对象序列化成JSON,比如:

@RequestMapping("getuser")
@ResponseBody
public User getUser() {
    User user = new User();
    user.setUserName("allan");
    user.setBirthday(new Date());
    return user;
}

User类:

public class User implements Serializable {
    private static final long serialVersionUID = 6222176558369919436L;
    
    private String userName;
    private int age;
    private String password;
    private Date birthday;
    get,set方法省略...
}

访问getuser页面输出:

{“userName”:“allan”,“age”:0,“password”:null,“birthday”:1522634892365}

可看到时间默认以时间戳的形式输出,如果想要改变这个默认行为,我们可以自定义一个ObjectMapper来替代:

import java.text.SimpleDateFormat;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.fasterxml.jackson.databind.ObjectMapper;

@Configuration
public class JacksonConfig {
    @Bean
    public ObjectMapper getObjectMapper(){
        ObjectMapper mapper = new ObjectMapper();
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        return mapper;
    }
}

上面配置获取了ObjectMapper对象,并且设置了时间格式。再次访问getuser,页面输出:

{“userName”:“allan”,“age”:0,“password”:null,“birthday”:“2019-09-14 10:14:24”}

序列化

Jackson通过使用mapper的writeValueAsString方法将Java对象序列化为JSON格式字符串:

@Autowired
ObjectMapper mapper;

@RequestMapping("serialization")
@ResponseBody
public String serialization() {
    try {
        User user = new User();
        user.setUserName("mrbird");
        user.setBirthday(new Date());
        String str = mapper.writeValueAsString(user);
        return str;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
反序列化

使用@ResponseBody注解可以使对象序列化为JSON格式字符串,除此之外,Jackson也提供了反序列化方法。

  • 树遍历
    当采用树遍历的方式时,JSON被读入到JsonNode对象中,可以像操作XML DOM那样读取JSON。比如:
@Autowired
ObjectMapper mapper;

@RequestMapping("readjsonstring")
@ResponseBody
public String readJsonString() {
    try {
        String json = "{\"name\":\"mrbird\",\"age\":26}";
        JsonNode node = this.mapper.readTree(json);
        String name = node.get("name").asText();
        int age = node.get("age").asInt();
        return name + " " + age;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

readTree方法可以接受一个字符串或者字节数组、文件、InputStream等, 返回JsonNode作为根节点,你可以像操作XML DOM那样操作遍历JsonNode以获取数据。

解析多级JSON例子:

String json = "{\"name\":\"mrbird\",\"hobby\":{\"first\":\"sleep\",\"second\":\"eat\"}}";;
JsonNode node = this.mapper.readTree(json);
JsonNode hobby = node.get("hobby");
String first = hobby.get("first").asText();
  • 绑定对象
    我们也可以将Java对象和JSON数据进行绑定,如下所示:
@Autowired
ObjectMapper mapper;

@RequestMapping("readjsonasobject")
@ResponseBody
public String readJsonAsObject() {
    try {
        String json = "{\"name\":\"mrbird\",\"age\":26}";
        User user = mapper.readValue(json, User.class);
        String name = user.getUserName();
        int age = user.getAge();
        return name + " " + age;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
Jackson注解

Jackson包含了一些实用的注解:

  • @JsonProperty
    *@JsonProperty,作用在属性上,用来为JSON Key指定一个别名。
@JsonProperty("bth")
private Date birthday;

再次访问getuser页面输出:

{“userName”:“allan”,“age”:0,“password”:null,“bth”:“2019-09-14 10:38:37”}

key birthday已经被替换为了bth。

  • @Jsonlgnore
    @Jsonlgnore,作用在属性上,用来忽略此属性。
@JsonIgnore
private String password;

再次访问getuser页面输出:

{“userName”:“allan”,“age”:0,“bth”:“2019-09-14 10:40:45”}

password属性已被忽略。

  • JsonIgnoreProperties

@JsonIgnoreProperties,忽略一组属性,作用于类上,比如JsonIgnoreProperties({ “password”, “age” })。

@JsonIgnoreProperties({ "password", "age" })
public class User implements Serializable {
    ...
}

再次访问getuser页面输出:

{“userName”:“allan”,“bth”:“2019-09-14 10:45:34”}

  • @JsonFormat
    @JsonFormat,用于日期格式化,如:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date birthday;
  • @JsonNaming
    @JsonNaming,用于指定一个命名策略,作用于类或者属性上。Jackson自带了多种命名策略,你可以实现自己的命名策略,比如输出的key 由Java命名方式转为下面线命名方法 —— userName转化为user-name。
@JsonNaming(PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy.class)
public class User implements Serializable {
    ...
}

再次访问getuser页面输出:

{“user_name”:“allan”,“bth”:“2019-09-14 10:52:12”}

  • @JsonSerialize

@JsonSerialize,指定一个实现类来自定义序列化。类必须实现JsonSerializer接口,代码如下:

import java.io.IOException;
import com.example.pojo.User;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;

public class UserSerializer extends JsonSerializer<User> {

    @Override
    public void serialize(User user, JsonGenerator generator, SerializerProvider provider)
            throws IOException, JsonProcessingException {
        generator.writeStartObject();
        generator.writeStringField("user-name", user.getUserName());
        generator.writeEndObject();
    }
}

上面的代码中我们仅仅序列化userName属性,且输出的key是user-name。 使用注解@JsonSerialize来指定User对象的序列化方式:

@JsonSerialize(using = UserSerializer.class)
public class User implements Serializable {
    ...
}

再次访问getuser页面输出:

{“user-name”:“allan”}

  • @JsonDeserialize
    @JsonDeserialize,用户自定义反序列化,同@JsonSerialize ,类需要实现JsonDeserializer接口。
import java.io.IOException;
import com.example.pojo.User;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;

public class UserDeserializer extends JsonDeserializer<User> {

    @Override
    public User deserialize(JsonParser parser, DeserializationContext context)
            throws IOException, JsonProcessingException {
        JsonNode node = parser.getCodec().readTree(parser);
        String userName = node.get("user-name").asText();
        User user = new User();
        user.setUserName(userName);
        return user;
    }
}

使用注解@JsonDeserialize来指定User对象的序列化方式:

@JsonDeserialize (using = UserDeserializer.class)
public class User implements Serializable {
    ...
}

测试:

@Autowired
ObjectMapper mapper;

@RequestMapping("readjsonasobject")
@ResponseBody
public String readJsonAsObject() {
    try {
        String json = "{\"user-name\":\"mrbird\"}";
        User user = mapper.readValue(json, User.class);
        String name = user.getUserName();
        return name;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

访问readjsonasobject,页面输出:

allan

  • @JsonView
    @JsonView,作用在类或者属性上,用来定义一个序列化组。 比如对于User对象,某些情况下只返回userName属性就行,而某些情况下需要返回全部属性。 因此User对象可以定义成如下:
public class User implements Serializable {
    private static final long serialVersionUID = 6222176558369919436L;
    
    public interface UserNameView {};
    public interface AllUserFieldView extends UserNameView {};
    
    @JsonView(UserNameView.class)
    private String userName;
    
    @JsonView(AllUserFieldView.class)
    private int age;
    
    @JsonView(AllUserFieldView.class)
    private String password;
    
    @JsonView(AllUserFieldView.class)
    private Date birthday;
    ...	
}

User定义了两个接口类,一个为userNameView,另外一个为AllUserFieldView继承了userNameView接口。这两个接口代表了两个序列化组的名称。属性userName使用了@JsonView(UserNameView.class),而剩下属性使用了@JsonView(AllUserFieldView.class)。

Spring中Controller方法允许使用@JsonView指定一个组名,被序列化的对象只有在这个组的属性才会被序列化,代码如下:

@JsonView(User.UserNameView.class)
@RequestMapping("getuser")
@ResponseBody
public User getUser() {
    User user = new User();
    user.setUserName("mrbird");
    user.setAge(26);
    user.setPassword("123456");
    user.setBirthday(new Date());
    return user;
}

访问getuser页面输出:

{“userName”:“allan”}

如果将@JsonView(User.UserNameView.class)替换为@JsonView(User.AllUserFieldView.class),输出:

{“userName”:“allan”,“age”:26,“password”:“123456”,“birthday”:“2019-09-14 11:24:00”}

因为接口AllUserFieldView继承了接口UserNameView所以userName也会被输出。

集合的反序列化

在Controller方法中,可以使用@RequestBody将提交的JSON自动映射到方法参数上,比如:

@RequestMapping("updateuser")
@ResponseBody
public int updateUser(@RequestBody List<User> list){
    return list.size();
}

上面方法可以接受如下一个JSON请求,并自动映射到User对象上:

[{“userName”:“allan”,“age”:26},{“userName”:“scott”,“age”:27}]

Spring Boot 能自动识别出List对象包含的是User类,因为在方法中定义的泛型的类型会被保留在字节码中,所以Spring Boot能识别List包含的泛型类型从而能正确反序列化。

有些情况下,集合对象并没有包含泛型定义,如下代码所示,反序列化并不能得到期望的结果。

@Autowired
ObjectMapper mapper;

@RequestMapping("customize")
@ResponseBody
public String customize() throws JsonParseException, JsonMappingException, IOException {
    String jsonStr = "[{\"userName\":\"mrbird\",\"age\":26},{\"userName\":\"scott\",\"age\":27}]";
    List<User> list = mapper.readValue(jsonStr, List.class);
    String msg = "";
    for (User user : list) {
        msg += user.getUserName();
    }
    return msg;
}

访问customize,控制台抛出异常:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.example.pojo.User

这是因为在运行时刻,泛型己经被擦除了(不同于方法参数定义的泛型,不会被擦除)。为了提供泛型信息,Jackson提供了JavaType ,用来指明集合类型,将上述方法改为:

@Autowired
ObjectMapper mapper;

@RequestMapping("customize")
@ResponseBody
public String customize() throws JsonParseException, JsonMappingException, IOException {
    String jsonStr = "[{\"userName\":\"mrbird\",\"age\":26},{\"userName\":\"scott\",\"age\":27}]";
    JavaType type = mapper.getTypeFactory().constructParametricType(List.class, User.class);
    List<User> list = mapper.readValue(jsonStr, type);
    String msg = "";
    for (User user : list) {
        msg += user.getUserName();
    }
    return msg;
}

访问customize,页面输出:allan scott。

source code
Unity3D Pico VR 手势交互实战:基于MRTK3实现抓握与射线控制 本文针对Pico VR原生手势交互功能不足的问题,提供了基于MRTK3实现高级手势交互的实战解决方案。通过将MRTK3成熟的交互框架与Pico的手势追踪能力相结合,详细讲解了从环境配置、SDK导入、核心适配到真机调试的全流程,帮助开发者高效实现抓握与射线控制等复杂交互,有效提升Pico VR应用的开发效率与体验。 阅读详情

相关推荐

USB PD快充功率监测仪:高精度嵌入式USB电压电流测量终端

USB供电已从数据接口演进为关键电源总线,尤其在PD快充场景下,工程师亟需对5V–20V宽压范围内的实时电压、电流及瞬时功率进行精准捕获。其底层原理依赖高共模抑制比的高边电流检测与分压采样+ADC数字化处理,结合LDO低噪声供电保障模拟链路精度。该类设备的技术价值在于以低成本实现协议无关的‘电气层可视化’,规避商用ASIC测试仪的黑盒局限,支撑PD充电验证、电源设计调试与教学实验等工程实践。本文介绍的开源USB表即基于N32G430 MCU与INA199电流检测芯片,覆盖USB-C输入/输出双通道监测,具备

weixin_42174098的博客 207

Spring Boot中解析JSON数据的三种方案

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。JSON是一个标记符的序列。这套标记符包含六个构造字符、字符串、数字和三个字面名。JSON是一个序列化的对象或数组。自己创建一个MappingJackson2HttpMessageConverter,取代JacksonHttpMessageConvertersConfiguration中项目自带的。例:@Bean。

qq_43842093的博客 6034

500道C++面试高频题解析(附答案、实战示例与进阶追问)

本文提供500道C++面试高频题的详细解析,涵盖基础概念到进阶应用,包括面向对象编程、内存管理、现代C++特性、并发编程等核心考点。每道题配有实战示例和进阶追问,帮助开发者突破八股文局限,掌握解决实际问题的能力,适合准备C++技术面试的工程师系统复习。

weixin_29002595的博客 311

springboot中json参数映射(jsonIgnore等)、@RequestBody、@PathVariable

springboot中json参数映射(jsonIgnore等)、@RequestBody等

enthan809882的博客 4595

永不消逝的电波 -GSM空口信号的接收与解码

一开始接触软件无线电应该是从很早之前对RFID洗衣卡的解密开始的,后来接触人员定位,慢慢的打开了这样一扇大门。。。。 翻到之前做的GSM信号的接收解码,今天就对其过程做一个记录,也不是什么新颖的内容,权当是记录和回忆了。 对于GSM网络的相关内容,不是非常的熟悉,如有不正确的,欢迎批评指正。

Jack.Xu 专栏 1万+

STM32嵌入式标准化封装五层架构设计与工程实践

在嵌入式系统开发中,代码封装是保障可维护性、可复用性与可靠性的核心工程能力。其本质是通过分层抽象(硬件抽象层→设备驱动层→应用逻辑层)解耦硬件依赖与业务逻辑,实现跨芯片移植、多任务安全及确定性实时响应。关键技术包括HAL库重构以消除硬编码初始化、驱动层提供同步/异步/事件驱动三类UART接口、中断优先级矩阵管理确保响应确定性、双阶段时钟配置兼顾启动鲁棒性与运行能效,以及面向Modbus等工业协议的语义化API封装。这些实践直击STM32项目中引脚变更难、HAL裸调风险高、中断处理不安全、时钟配置僵化等典型痛

weixin_35019679的博客 68

SpringBoot (二) --- 返回Json数据

SpringBoot的学习之旅~

qq_54103767的博客 9490

计算数列位置N的值

本文介绍了一个数列生成问题,要求根据输入的两个整数M和N生成特定规则的数列,并输出第N个位置上的数值。数列生成规则为:前M个元素为1到M;后续元素根据前M个元素是否重复来决定计算方式(求和或求差)。文章提供了C++、Java和Python三种语言的实现方案,均包含输入处理、数列初始化、循环计算和结果输出等步骤。各语言实现中均使用集合去重特性判断重复元素,并通过内置函数或自定义方法求取最大值和最小值。该问题主要考察基础编程能力,包括数组/列表操作、最值计算和重复元素判断等基本编程技巧。

面试高手的博客 655

springboot中表字段映射中设置JSON格式字段映射

场景 springboot中@Result注解设置字段及实体属性映射关系,当字段类型为JSONObject和JSONArray时设置映射关系 解决方案 JSON格式表字段映射: @Result(column = "alarm_rule", property = "alarmRule", jdbcType = JdbcType.OTHER, typeHandler = com.geespace.microservices.data.metrics.config.server.dao.MySqlJsonHan.

刘大猫 2238

YOLOv9改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

本文记录的是改进YOLOv9的损失函数,将其替换成Slide Loss,并详细说明了优化原因,注意事项等。Slide Loss函数可以有效地解决样本不平衡问题,为困难样本赋予更高的权重,使模型在训练过程中更加关注困难样本。若是在自己的数据集中发现容易样本的数量非常大,而困难样本相对稀疏,可尝试使用Slide Loss来提高模型在处理复杂样本时的性能。

Limiiiing的博客 2601

c\c++: Identifiers, modifier, qualifier, specifier, decorator; systemtap

文章目录参考英语含义在c、C++ 参考 c++ 标准 https://blog.csdn.net/tyronne/article/details/44016621 英语含义 modifier word or phrase that modifies (modify 2) another word or phrase 修饰语. qualifier (grammar) word, esp an adjective or adverb, that qualifies another word 修饰词; (尤指)形

mzhan017的博客 2430

【Spring Boot】 Spring Boot 中使用 JSON Schema 来校验复杂JSON数据

JSON是我们编写API时候用于数据传递的常用格式,那么你是否知道JSON Schema呢?在数据交换领域,JSON Schema 以其强大的标准化能力,为定义和规范 JSON 数据的结构与规则提供了有力支持。通过一系列精心设计的关键字,JSON Schema 能够详尽地描述数据的各项属性。然而,仅凭 JSON Schema 本身,尚不足以验证 JSON 实例是否严格遵循预设的模式。此时,JSON Schema 验证器的角色便显得尤为关键。

smile_sundays的博客 1956

将Keil中的变量数组导出

首先,写好导出数据的函数。

小柚子的博客 1952

Spring Boot 中使用 JSON Schema 来校验复杂JSON数据

在应用程序接口(API)的开发中,JSON作为一种数据交换格式被广泛利用。然而,对数据的结构和规则进行标准化是至关重要的,这正是JSON Schema发挥作用的地方。JSON Schema通过一套精确的关键字,能够详细地定义数据的属性,包括类型、格式及其关系等。尽管如此,如果缺乏合适的工具来执行这些标准,JSON Schema本身无法确保数据实例严格遵循所设定的模式。因此,引入JSON Schema验证器成为确保数据一致性的关键步骤。

2301_76419561的博客 1338

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Spring Boot中的JSON技术

平日里在项目中处理JSON一般用的都是阿里巴巴的Fastjson,后来发现使用Spring Boot内置的Jackson来完成JSON的序列化和反序列化操作也挺方便。Jackson不但可以完成简单的序列化和反序列化操作,也能实现复杂的个性化的序列化和反序列化操作。@Getter@Setter访问getuser页面输出:@Bean上面配置获取了ObjectMapper对象,并且设置了时间格式。

wno704的博客 751

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring Boot2 JSON技术

得到和获取都是有代价的,最孤独最痛苦的那段时光其实是你成长速度最快的时候,不要在奋斗的年纪选择享受,我们要知道生命的天平总在合理的范围内摆动,付出了才有得到的机会。 Spring Boot内置了jackson来完成JSON的序列化和反序列化操作,而且,在与其他技术集成的时候,比如Redis,MongoDB,Elasticsearch等对象序列化,默认都是使用jackson来完成的。 在Co...

程序员那点事儿 3247

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

spring boot 封装json

我整理的一些关于【JSON】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/Hpqqk2Spring Boot 封装 JSON 数据的实现 在现代微服务架构和前后端分离的开发模式中,JSON(JavaScript Object Notation)作为数据交换格式,得到了广泛应...

weixin_29952235的博客 287

Spring Boot 2.x实战46 - Spring Web MVC 18 - Web MVC配置(JSON配置)

3.10 JSON Spring MVC给我们提供了多种Json的实现,包含:Jackson、Gson、JSON-B。 Jackson使用的是MappingJackson2HttpMessageConverter,Spring Boot提供的自动配置为:JacksonAutoConfiguration Gson使用的是GsonHttpMessageConverter,Spring Boot提供的自动配置为:GsonAutoConfiguration JSON-B使用的是JsonbHttpMess

汪云飞记录本 354

Spring boot引入JSON、JSON字符串与JAVA对象的转换

Spring boot引入JSON、JSON字符串与JAVA对象的转换 开发工具:IDEA 创建springboot项目,引入以下依赖包: &lt;dependency&gt; &lt;groupId&gt;net.sf.json-lib&lt;/groupId&gt; &lt;artifactId&gt;json-lib&lt;/a...

qq_39484442的博客 3万+

Sa-Token v1.45.0更新:Spring Boot 4支持与JSON插件优化

权限认证是Java应用安全架构的核心组件,其实现原理通常基于Token或Session机制。现代框架通过模块化设计解决兼容性问题,例如Spring Boot大版本升级时的自动配置适配。在分布式场景下,JSON序列化性能直接影响系统吞吐量,Jackson和Snack等库通过算法优化提升处理效率。Sa-Token作为轻量级权限框架,在v1.45.0版本中重点优化了这两大技术点:通过条件化配置实现Spring Boot 4前瞻性支持,同时新增Jackson3和Snack4插件选项,其中Snack4在高并发测试中展

weixin_30614109的博客 934

从HTTP接口到Java对象:用FastJSON的parseObject搞定Spring Boot项目里的JSON解析

本文深入探讨了FastJSON在Spring Boot项目中的高效JSON解析实践,重点介绍了parseObject方法的应用场景与性能优势。通过实战案例展示了如何将HTTP接口的JSON数据转换为Java对象,涵盖前后端交互、第三方API调用等典型场景,并提供了安全防护、异常处理等最佳实践,帮助开发者提升JSON处理效率与系统稳定性。

weixin_30614109的博客 396

第18课:Spring Boot搭建实际项目开发中的架构

配置好了之后,接下来我们来写一下 dao 层,实际中我们使用注解比较多,因为比较方便,当然也可以使用 xml 的方式,甚至两种同时使用都行,这里我们主要使用注解的方式来集成,关于 xml 的方式,大家可以查看前面课程,实际中根据项目情况来定。前面的课程中,我主要给大家讲解了 Spring Boot 中常用的一些技术点,这些技术点在实际项目中可能不会全部用得到,因为不同的项目可能使用的技术不同,但是希望大家都能掌握如何使用,并能自己根据实际项目中的需求进行相应的扩展。首先先自定义一个拦截器。

m0_37613191的博客 540

【Spring Boot】——集成JSON工具

前言:json是现在非常流程的数据交换格式,所以对于被开发人员来说如何更好了解java对象和json格式之间的转换是至关重要的,接下来我们来好好说一说。 一、什么是JSON(摘自百度百科) JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语...

山山来驰的博客 1686
上一篇: MySQL中boolean类型的解决方案
下一篇: 判断List、Map、Set是否为空及效率比较
Spring的思念
博客等级 码龄7年 80粉丝 143原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值