Jackson無縫替換Fastjson

目錄

文章目錄

  • 一,Fastjson到Jackson的替換方案
    • 方案代碼
    • 序列化
    • 反序列化
    • 通過key獲取某種類型的值
    • 類型替換
  • 二,Springboot工程中序列化的使用場景
  • 三,SpringMVC框架中的Http消息轉換器
    • 1,原理:
    • 2,自定義消息轉換器
      • Fastjson序列化消息轉換器定義:
      • Jackson序列化消息轉換器定義:
    • 3,Jackson常用注解自定義序列化規則

一,Fastjson到Jackson的替換方案

方案代碼

package main.java.solutions;import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.MapperFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;import java.io.IOException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;/*** json工具類* @Date: 2023/7/4 14:38*/
@Slf4j
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class JsonUtil {/*** 這個是提供給http接口使用的對象*/private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();static {// 通過該方法對mapper對象進行設置,所有序列化的對象都將按改規則進行系列化// Include.Include.ALWAYS 默認// Include.NON_DEFAULT 屬性為默認值不序列化// Include.NON_EMPTY 屬性為 空("") 或者為 NULL 都不序列化,則返回的json是沒有這個字段的。這樣對移動端會更省流量// Include.NON_NULL 屬性為NULL 不序列化OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.NON_NULL);OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);OBJECT_MAPPER.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, true);OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);OBJECT_MAPPER.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);OBJECT_MAPPER.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES, true);SimpleModule module = new SimpleModule();module.addSerializer(BigDecimal.class, ToStringSerializer.instance);module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());module.addSerializer(LocalDate.class, new LocalDateSerializer());module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeSerializer());module.addDeserializer(LocalDate.class, new LocalDateDeSerializer());OBJECT_MAPPER.registerModule(module);}/*** 直接獲取ObjectMapper對象*/public static ObjectMapper getObjectMapper() {return OBJECT_MAPPER;}/*** 序列化一個對象,序列化失敗時僅僅打印日志并且返回null。** @param object 對象* @return String*/public static String toJsonOrNull(Object object) {if (object == null) {return null;}try {return OBJECT_MAPPER.writeValueAsString(object);} catch (JsonProcessingException e) {log.error("Json serialize error :", e);}return null;}/*** 序列化一個對象,序列化失敗則拋異常** @param object 對象* @return String*/public static String toJsonString(Object object) throws Exception {if (object == null) {return null;}try {return OBJECT_MAPPER.writeValueAsString(object);} catch (JsonProcessingException e) {log.error("Json serialize error :", e);throw new Exception("Json serialize error");}}/*** 反序列化,失敗則拋異常*/public static <T> T parseObject(String json, Class<T> classType) throws Exception {if (StringUtils.isEmpty(json)) {return null;}try {return OBJECT_MAPPER.readValue(json, classType);} catch (Exception e) {log.error("Json de-serialize error :", e);throw new Exception("Json de-serialize error");}}/*** 自定義復雜的泛型對象,反序列化,失敗則拋異常*/public static <T> T parseObject(String json, TypeReference<T> typeReference) throws Exception{if (StringUtils.isEmpty(json)) {return null;}try {return OBJECT_MAPPER.readValue(json, typeReference);} catch (Exception e) {log.error("Json de-serialize error :", e);throw new Exception("Json de-serialize error");}}/*** 反序列化為Map*/public static Map<String, Object> parseMap(String json) throws Exception{return parseObject(json, new TypeReference<Map<String, Object>>() {});}/*** 自定義 List 類型的反序列化** @param json      JSON 字符串* @param classType List 中元素的類類型* @param <T>       List 中元素的泛型類型* @return 反序列化后的 List 對象*/@SuppressWarnings("unchecked")public static <T> List<T> parseArray(String json, Class<T> classType) throws Exception {if (StringUtils.isEmpty(json)) {return null;}try {return parseCollection(json, ArrayList.class, classType);} catch (Exception e) {log.error("Error occurred during json deserialization for List: ", e);throw new Exception("Error occurred during json deserialization");}}/*** 通用的集合類型反序列化** @param jsonStr     JSON 字符串* @param resultClass 結果集合的類類型* @param classType   集合元素的類類型* @param <C>         返回結果的泛型類型,必須是 Collection 的子類* @param <T>         集合元素的泛型類型* @return 反序列化后的集合對象* @throws IOException 如果反序列化過程中出現 I/O 錯誤*/public static <C extends Collection<T>, T> C parseCollection(String jsonStr, Class<C> resultClass, Class<T> classType) throws IOException {return OBJECT_MAPPER.readValue(jsonStr, OBJECT_MAPPER.getTypeFactory().constructCollectionType(resultClass, classType));}public static Long getLong(Map<String, Object> map, String key) throws Exception {return TypeUtils.castToLong(map.get(key));}public static Integer getInteger(Map<String, Object> map, String key) throws Exception{return TypeUtils.castToInt(map.get(key));}public static String getString(Map<String, Object> map, String key) {return TypeUtils.castToString(map.get(key));}}
package main.java.solutions;import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** 類型轉換類* @Date: 2023/7/4 14:38*/
public class TypeUtils {private static final Pattern NUMBER_WITH_TRAILING_ZEROS_PATTERN = Pattern.compile("\\.0*$");public static String castToString(Object value) {if (value == null) {return null;}return value.toString();}public static Integer castToInt(Object value) throws Exception{if (value == null) {return null;}if (value instanceof Integer) {return (Integer)value;}if (value instanceof BigDecimal) {return intValue((BigDecimal)value);}if (value instanceof Number) {return ((Number)value).intValue();}if (value instanceof String) {String strVal = (String)value;if (strVal.length() == 0 //|| "null".equals(strVal) //|| "NULL".equals(strVal)) {return null;}if (strVal.indexOf(',') != -1) {strVal = strVal.replaceAll(",", "");}Matcher matcher = NUMBER_WITH_TRAILING_ZEROS_PATTERN.matcher(strVal);if (matcher.find()) {strVal = matcher.replaceAll("");}return Integer.parseInt(strVal);}if (value instanceof Boolean) {return (Boolean)value ? 1 : 0;}if (value instanceof Map) {Map map = (Map)value;if (map.size() == 2&& map.containsKey("andIncrement")&& map.containsKey("andDecrement")) {Iterator iter = map.values().iterator();iter.next();Object value2 = iter.next();return castToInt(value2);}}throw new Exception("Cast type error: "+value);}public static Long castToLong(Object value) throws Exception {if (value == null) {return null;}if (value instanceof BigDecimal) {return longValue((BigDecimal)value);}if (value instanceof Number) {return ((Number)value).longValue();}if (value instanceof String) {String strVal = (String)value;if (strVal.length() == 0 //|| "null".equals(strVal) //|| "NULL".equals(strVal)) {return null;}if (strVal.indexOf(',') != -1) {strVal = strVal.replaceAll(",", "");}try {return Long.parseLong(strVal);} catch (NumberFormatException ex) {//}}if (value instanceof Map) {Map map = (Map)value;if (map.size() == 2&& map.containsKey("andIncrement")&& map.containsKey("andDecrement")) {Iterator iter = map.values().iterator();iter.next();Object value2 = iter.next();return castToLong(value2);}}if (value instanceof Boolean) {return (Boolean)value ? 1L : 0L;}throw new Exception("Cast type error: "+value);}public static int intValue(BigDecimal decimal) {if (decimal == null) {return 0;}int scale = decimal.scale();if (scale >= -100 && scale <= 100) {return decimal.intValue();}return decimal.intValueExact();}public static long longValue(BigDecimal decimal) {if (decimal == null) {return 0;}int scale = decimal.scale();if (scale >= -100 && scale <= 100) {return decimal.longValue();}return decimal.longValueExact();}
}

序列化

1,JSON.toJSONString(this)JSON.toJSON(this); if為null,則返回null,如果轉換異常,就拋異常。

如果是日志打印就使用JsonUtils.toJsonOrNull(this)替換,否則使用JsonUtils.toJsonString(this)

反序列化

1,JSON.parseObject(deviceInfoStr, DeviceInfo.class); if為null,則返回null,如果轉換異常,就拋異常

使用**JsonUtils.parseObject(deviceInfoStr, DeviceInfo.class)**替換

2,JSON.parseObject(String text);if為null,則返回null,如果轉換異常,就拋異常

使用 **JsonUtils.parseMap(String json)**替換

3,JSONObject.parseArray(String text, Class<T> clazz);if為null,則返回null,如果轉換異常,就拋異常

使用 **JsonUtils.parseArray(String text, Class<T> clazz)**替換;

通過key獲取某種類型的值

1,jsonObject.getLong(String key) ;if為null,則返回null,如果轉換異常,就拋異常

使用**JsonUtils.getLong(map, key)**替換;

2,jsonObject.getInteger(String key) ;if為null,則返回null,如果轉換異常,就拋異常

使用 **JsonUtils.getInteger(map, key)**替換;

3,jsonObject.getString(String key) ;if為null,則返回null,如果轉換異常,就拋異常

使用 **JsonUtils.getString(map, key)**替換;

類型替換

7,返回給前端的是JSONObject使用**Map<String, Object>**替換

8,返回給前端的是JSONArray使用**List<Object>**替換

二,Springboot工程中序列化的使用場景

  1. 控制器(Controller):控制器負責處理 HTTP 請求和響應,其中涉及到請求參數的反序列化和響應結果的序列化。SpringMVC 使用消息轉換器(MessageConverter)來處理請求和響應的序列化和反序列化,常見的消息轉換器包括 JSON、XML、Form 表單等。
  2. RESTful API:如果您的 Spring Boot 項目是基于 RESTful API 架構的,那么在請求和響應的過程中,需要進行對象和 JSON/XML 數據之間的序列化和反序列化。Spring Boot 使用消息轉換器來自動處理這些轉換過程。
  3. 數據庫操作:當使用對象關系映射(ORM)框架(如 Hibernate、Spring Data JPA)進行數據庫操作時,需要將 Java 對象與數據庫記錄之間進行序列化和反序列化。ORM 框架會自動將對象轉換為數據庫記錄(序列化),或將數據庫記錄轉換為對象(反序列化)。
  4. 緩存操作:在使用緩存(如 Redis、Memcached)時,需要將對象存儲到緩存中或從緩存中獲取對象。這涉及到將對象進行序列化和反序列化,以便在緩存中進行存儲和檢索。
  5. 消息隊列:如果在 Spring Boot 項目中使用消息隊列(如 RabbitMQ、Kafka)進行異步消息處理,那么消息的生產者和消費者之間需要進行對象的序列化和反序列化,以便在消息傳遞過程中正確地傳遞和處理對象數據。
  6. 文件存儲:當將Java對象以文件形式存儲時,可能需要將其序列化為JSON或其他格式,以便于讀取和寫入。

三,SpringMVC框架中的Http消息轉換器

1,原理:

利用SpringMVC框架,可以使得我們在開發時,只要在代碼中使用**@RequestBody@ResponseBody兩個注解,就可以分別完成從請求報文到對象和從對象到響應報文的轉換。而在源碼內部,其實這種靈活的消息轉換機制就是利用HttpMessageConverter**來實現的。

HttpMessageConverter的調用是在RequestResponseBodyMethodProcessor類的解析請求參數的方法resolveArgument()和處理返回值的方法handleReturnValue()中進行調用的。

在這里插入圖片描述

Http消息轉換器接口

org.springframework.http.converter.HttpMessageConverter 3

public interface HttpMessageConverter<T> {boolean canRead(Class<?> var1, @Nullable MediaType var2);boolean canWrite(Class<?> var1, @Nullable MediaType var2);List<MediaType> getSupportedMediaTypes();T read(Class<? extends T> var1, HttpInputMessage var2) throws IOException, HttpMessageNotReadableException;void write(T var1, @Nullable MediaType var2, HttpOutputMessage var3) throws IOException, HttpMessageNotWritableException;
}

鏈路

http請求 -DispatcherServlet -RequestMappingHandlerAdapter(處理請求映射的適配器)-ArgumentResolver(參數解析器)/ReturnValueHandlers(返回值處理器)-RequestResponseBodyMethodProcessor(處理請求和返回的參數)-HttpMessageConverter的read,write方法

org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport#requestMappingHandlerAdapter 1

protected final List<HttpMessageConverter<?>> getMessageConverters() {if (this.messageConverters == null) {this.messageConverters = new ArrayList();//這是一個抽象方法,允許子類覆蓋它來配置HTTP消息轉換器。開發者可以在子類中實現這個方法來添加自定義的消息轉換器。this.configureMessageConverters(this.messageConverters);if (this.messageConverters.isEmpty()) {//中添加一組默認的HTTP消息轉換器。這些默認轉換器是Spring MVC框架提供的,用于支持常見的數據格式,如JSON、XML等。this.addDefaultHttpMessageConverters(this.messageConverters);}//這是一個可選的方法,允許子類進一步擴展或修改已經配置的HTTP消息轉換器。開發者可以在子類中實現這個方法來對已有的消息轉換器進行額外的定制。this.extendMessageConverters(this.messageConverters);}return this.messageConverters;}

有幾種類型的轉換器:

在這里插入圖片描述

ByteArrayHttpMessageConverter:負責讀取二進制格式的數據和寫出二進制格式的數據;

StringHttpMessageConverter:負責讀取字符串格式的數據和寫出二進制格式的數據(當返回值是或者接受值是String類型時,是由這個處理)

ResourceHttpMessageConverter:負責讀取資源文件和寫出資源文件數據;

ResourceRegionHttpMessageConverter:用于支持分塊傳輸(Chunked Transfer Encoding)的響應。它允許將資源按照指定的區塊大小進行切分,分塊傳輸響應給客戶端。

SourceHttpMessageConverter:用于處理以XML格式或其他文本格式表示的數據。它支持處理一些Java源數據(Source)類型,如javax.xml.transform.Source(XML數據的源表示)和org.springframework.core.io.Resource(資源文件的源表示)。

AllEncompassingFormHttpMessageConverter:它是一個綜合性的表單數據轉換器,用于處理表單數據的請求和響應。

Jaxb2RootElementHttpMessageConverter:用于處理XML數據,并支持Java對象與XML數據之間的轉換。它主要依賴于Java Architecture for XML Binding (JAXB) API來實現XML數據的序列化和反序列化。

MappingJackson2HttpMessageConverter:負責讀取和寫入json格式的數據;(當返回值是對象或者List,就由這個處理)

org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor 2

2,自定義消息轉換器

一般默認的轉換器不能滿足我們的需求,需要自定義消息轉換器,可以創建自己的轉換器類(Fastjson,Jackson消息轉換器),并在 Spring Boot 配置中進行注冊。通常情況下,只需要注冊您的自定義轉換器,Spring Boot 將自動將其應用于適當的請求和響應。

Fastjson序列化消息轉換器定義:

@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {//使用fastjson converterFastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();FastJsonConfig config = new FastJsonConfig();config.setSerializerFeatures(SerializerFeature.DisableCircularReferenceDetect,SerializerFeature.WriteNullListAsEmpty,SerializerFeature.WriteMapNullValue,SerializerFeature.WriteNullStringAsEmpty,SerializerFeature.WriteBigDecimalAsPlain);config.setSerializeFilters(ValueDesensitizeFilter.INSTANCE);// serialize configSerializeConfig serializeConfig = SerializeConfig.getGlobalInstance();serializeConfig.put(BigDecimal.class, ToStringSerializer.instance);serializeConfig.put(LocalDateTime.class, LocalDateTimeSerializer.instance);serializeConfig.put(Long.class, ToStringSerializer.instance);serializeConfig.put(Long.TYPE, ToStringSerializer.instance);config.setSerializeConfig(serializeConfig);converter.setFastJsonConfig(config);converters.add(0, converter);}
}

Jackson序列化消息轉換器定義:

@Configuration
public class JacksonConfig {@Bean@ConditionalOnMissingBean(ObjectMapper.class)public ObjectMapper objectMapper() {ObjectMapper objectMapper = new ObjectMapper();// 通過該方法對mapper對象進行設置,所有序列化的對象都將按改規則進行序列化// Include.Include.ALWAYS 默認// Include.NON_DEFAULT 屬性為默認值不序列化// Include.NON_EMPTY 屬性為 空("") 或者為 NULL 都不序列化,則返回的json是沒有這個字段的。這樣對移動端會更省流量// Include.NON_NULL 屬性為NULL 不序列化objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);objectMapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);//解析數組集合、List對象 為[]objectMapper.setSerializerFactory(objectMapper.getSerializerFactory().withSerializerModifier(new SerializerModifier()));SimpleModule simpleModule = new SimpleModule();simpleModule.addSerializer(BigDecimal.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.class, ToStringSerializer.instance);simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);simpleModule.addSerializer(LocalDateTime.class, new LocalDateTimeToTimestampSerializer());simpleModule.addSerializer(LocalDate.class, new LocalDateSerializer());simpleModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeSerializer());simpleModule.addDeserializer(LocalDate.class, new LocalDateDeSerializer());objectMapper.registerModule(simpleModule);return objectMapper;}
}

如何優雅地使用Jackson進行序列化和反序列化操作?

定義一個通用的工具類,對于屬性特殊的規則,可以在屬性上加注解。

3,Jackson常用注解自定義序列化規則

@JsonFormat 注解來自定義日期格式。

public class User {private String name;@JsonFormat(pattern = "yyyy-MM-dd")private Date birthday; 
}

@JsonIgnore 注解來排除不想序列化的字段。

public class User {private String name;@JsonIgnoreprivate String password;
}

@JsonProperty 注解來自定義字段名稱。

public class User {@JsonProperty("username")private String name;
}

@JsonInclude 注解來指定字段的空值處理策略。

public class User {private String name;@JsonInclude(JsonInclude.Include.NON_NULL)private String email;
}

使用 @JsonSerialize 和 @JsonDeserialize 注解來指定自定義的序列化器和反序列化器。

public class User {private String name;@JsonSerialize(using = LocalDateTimeSerializer.class)@JsonDeserialize(using = LocalDateTimeDeSerializer.class)private LocalDateTime birthday;
}

自定義反序列化器:

/*** 新建這個反序列化器的目的:源String串中extendFieldJson屬性是對象類型,目標對象DeviceInfo中的extendFieldJson屬性是String類型,轉換的時候會報類型不匹配的錯誤。** @Date: 2023/9/19 18:00*/
public class ObjectToStringDeSerializer extends JsonDeserializer<String> {@Overridepublic String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {// 從 JSON 中讀取屬性的對象值Object objectValue = jsonParser.readValueAs(Object.class);// 將對象值轉換為json字符串if (objectValue != null) {return JsonUtil.toJsonString(objectValue);}return null;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164153.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是mvc原理是什么

MVC是一種設計模式&#xff0c;它將應用程序分為三個部分&#xff1a;模型&#xff08;Model&#xff09;、視圖&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。 模型&#xff08;Model&#xff09;表示應用程序的數據結構&#xff0c;包括與數據相…

常用腳本-持續更新(文件重命名、視頻抽幀、拆幀)

所有代碼位置&#xff1a;Learning-Notebook-Codes/Python/常用腳本 1. 文件重命名 1.1 說明 腳本路徑&#xff1a;codes/files_rename.py腳本說明&#xff1a;可以自動重命名某個文件夾下指定類型的文件。 修改前文件名稱: img1.jpg修改后文件名稱: Le0v1n-20231123-X-0001…

python-opencv在圖片中繪制各種圖形

python-opencv在圖片中繪制各種圖形 1.繪制直線 2.繪制矩形 3.繪制圓 4.繪制橢圓 5.繪制多邊形 6.嵌入文字 實現代碼都在下面了&#xff0c;代碼中參數做了簡單注釋 import copy import math import matplotlib.pyplot as plt import matplotlib as mpl import numpy a…

window非gui形式運行jmeter腳本

配置jmeter環境 新增1個環境變量&#xff1a; JMETER_HOMED:\Tools\apache-jmeter-5.0 【jmeter文件夾】 編輯CLASSPATH&#xff1a; CLASSPATH后面加上 %JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar; 編輯path&#xff1a; path后面加上 %JM…

二次開發問題匯總【C#】

1未將對象引用到實例。 接口函數的參數不對。解決辦法【用fixed去限制數組長度】 unsafe public struct VCI_BOARD_INFO {public UInt16 hw_Version;public UInt16 fw_Version;public UInt16 dr_Version;public UInt16 in_Version;public UInt16 irq_Num;public byte can_Num;…

C語言眾數問題(ZZULIOJ1201:眾數問題)

題目描述 給定含有n個元素的多重集合S&#xff0c;每個元素在S中出現的次數稱為該元素的重數。多重集S中重數最大的元素稱為眾數。 例如&#xff0c;S{1&#xff0c;2&#xff0c;2&#xff0c;2&#xff0c;3&#xff0c;5}。多重集S的眾數是2&#xff0c;其重數為3。 編程任務…

前端學習--React(3)

一、Redux 集中狀態管理工具&#xff0c;不需要react即可使用&#xff0c;每個store的數據都是獨立于組件之外的 vue小鏈接&#xff1a;vuex/pinia 基本使用 Redux將數據修改流程分成三個概念&#xff0c;state、action和reducer state - 一個對象 存放我們管理的數據狀態 a…

1688API如何獲取商品詳情信息(關鍵詞搜索商品列表),1688API接口開發系列

1688商品詳情接口是指1688平臺提供的API接口&#xff0c;用于獲取商品詳情信息。通過該接口&#xff0c;您可以獲取到商品的詳細信息&#xff0c;包括商品標題、價格、庫存、描述、圖片等。 要使用1688商品詳情接口&#xff0c;您需要先申請1688的API權限&#xff0c;并獲取ac…

UML建模圖文詳解教程01——Enterprise Architect安裝與使用

版權聲明 本文原創作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方網站&#xff1a;https://www.sparxsystems.cn/products/ea/&#xff1b;圖示如下&#xff1a; Enterprise Architect是一個全功能的、基于…

Python入門02 算術運算符及優先級

目錄 1 REPL2 啟動3 算術運算符4 算術運算符的優先級5 清除屏幕總結 上一節我們安裝了Python的開發環境&#xff0c;本節我們介紹一下REPL的概念 1 REPL 首先解釋一下python執行代碼的一個交互環境的定義&#xff1a; Python REPL&#xff08;Read-Eval-Print Loop&#xff0c…

靠這份求職指南找工作,穩了!

大家好&#xff0c;我是魚皮。為了幫助朋友們更好的準備秋招&#xff0c;我們精心匯總整理了 編程導航星球 內魚友反饋的 200 多個高頻求職問題和 150 多篇面經、以及最新秋招企業投遞信息表&#xff0c;解答大家的求職困惑。 一、最新秋招投遞信息表 目前已匯總整理了 600 多家…

C百題--3.求未知數

1.問題描述 一個正整數&#xff0c;它加上100后是一個完全平方數&#xff0c;再加上168又是一個完全平方數&#xff0c;請問該數是多少&#xff1f; 2.解決思路 遍歷這個數&#xff0c;讓其從1開始&#xff0c;到100000結束 3.代碼實現 #include<stdio.h> #include&…

2.C語言--鏈表-頭插、頭刪、尾插、尾刪、查找、插入和刪除

文章目錄 簡介動態順序表結構體1.頭插功能2.頭刪功能3.尾插功能4.尾刪功能5.查找功能6.插入功能6.1 指定位置之&#xff08;前&#xff09;去插入一個節點6.2 指定位置之&#xff08;后&#xff09;去插入一個節點 7.刪除功能7.1 刪除指定位置的數據-時間復雜度O(N)7.2 刪除指定…

配置hikari數據庫連接池時多數據源不生效

1.原始配置&#xff0c;改造前&#xff1a; spring:# 配置數據源信息datasource:dynamic:#設置默認的數據源或者數據源組,默認值即為masterprimary: masterstrict: truedatasource:#這里采用了配置文件取值的方式&#xff0c;可以直接替換為數據庫連接master:url: jdbc:postgr…

【LLS-Player】音視頻幀的回調過程

RtdSinkInterface 實現者用于從SDK獲取音視頻幀 class RtdSinkInterface {public:virtual ~RtdSinkInterface() = default;virtual void OnAudioFrame(const RtdAudioFrame& fra

電子學會C/C++編程等級考試2023年03月(一級)真題解析

C/C++等級考試(1~8級)全部真題?點這里 第1題:字符長方形 給定一個字符,用它構造一個長為4個字符,寬為3個字符的長方形,可以參考樣例輸出。 時間限制:1000 內存限制:65536輸入 輸入只有一行, 包含一個字符。輸出 該字符構成的長方形,長4個字符,寬3個字符。樣例輸入…

如何使用Fiddler進行弱網測試

測試APP、web經常需要用到弱網測試&#xff0c;也就是在信號差、網絡慢的情況下進行測試。我們自己平常在使用手機APP時&#xff0c;在地鐵、電梯、車庫等場景經常會遇到會話中斷、超時等情況&#xff0c;這種就屬于弱網。 普通的弱網測試可以選擇第三方工具對帶寬、丟包、延時…

python數據類型之字典、元組

一、字典 1、定義字典 字典是 有序&#xff08;3.6以前無序&#xff09;、鍵不重復 且 元素只能是鍵值對的可變的 個 容器。鍵不重復&#xff0c;重復則會被覆蓋 如下定義一個字典 # 使用大括號 {} 來創建空字典 test_dic1 {} # 使用內建函數 dict() 創建字典&#xff1a;…

【華為OD題庫-032】數字游戲-java

題目 小明玩一個游戲。系統發1n張牌&#xff0c;每張牌上有一個整數。第一張給小明&#xff0c;后n張按照發牌順序排成連續的一行。需要小明判斷&#xff0c;后n張牌中&#xff0c;是否存在連續的若干張牌&#xff0c;其和可以整除小明手中牌上的數字. 輸入描述: 輸入數據有多組…