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

哪些网站可以做微信公司seo

哪些网站可以做微信,公司seo,网站开发赚钱的方法,西安今天消息在网络请求或接口签名中,通常要求将参数按照一定规则拼接成字符串。一个常见的做法是对字典的 key 进行排序,然后按照 “keyvalue” 的格式拼接,多个参数之间以特定符号(例如 &)连接。 如果参数中包含嵌套的字典或…

在网络请求或接口签名中,通常要求将参数按照一定规则拼接成字符串。一个常见的做法是对字典的 key 进行排序,然后按照 “key=value” 的格式拼接,多个参数之间以特定符号(例如 &)连接。

如果参数中包含嵌套的字典或数组,则需要递归展开。这样的处理不仅可以保证字符串的唯一性,同时也方便后续的加密或签名操作。

  • 入参
    • 一个可以转成json的字典或者数组
    • 比如:["b": 2, "a": 1]
  • 返回值
    • 按照key进行排序后的字符串
    • 比如:a=1&b=2

下面的算法不仅支持简单的键值对,还能够递归处理嵌套结构,使得所有数据都能被有序地转换为字符串形式,从而满足不同业务场景下的参数签名需求。

为什么非要自己实现呢?

  1. 这是因为字典是无序的,一个key-value完全相等的字典,转成jsonString是不一样的。
  2. 平台差异,iOS平台转成的json字符串和Java平台、go平台生成的字符串规则是不一样的,需要一个规则把无序的对象处理成有序的字符串

同一个平台,对同一个字典,生成json字符串结果都不一样。比如:

    func testOrign() {let dictionary: [String: Any] = ["b": [1,["d": 4, "c": 3]],"a": ["e": 5,"f": [6, 7],"uid": 8,"age": 20.124,"student": true,"teacher": false,"dic":["rID":"123","author":"gcs",]],"image": ["10", "11", "12", "15"],"array":[[1,2,3],["1","2","3"],["rID":"123","author":"gcs"],["rID":"1234","author":"g"],]]// 把这个字典转出josn字符串,然后再转回字典,看看是否和原来的字典一样let jsonData = try! JSONSerialization.data(withJSONObject: dictionary, options: [])let jsonString = String(data: jsonData, encoding: .utf8)!print("jsonString",jsonString)do {let dictionary2 = try! JSONSerialization.jsonObject(with: jsonData, options: []) as! [String: Any]let jsonData2 = try! JSONSerialization.data(withJSONObject: dictionary2, options: [])let jsonString2 = String(data: jsonData2, encoding: .utf8)!print("jsonString2",jsonString2)}}

实现思路

SignTool 类的核心在于两个方法:一个是用于处理字典的 concatenate(dictionary:),另一个是私有方法 concatenate(array:),用于处理数组。整个实现思路可以分为以下几个步骤:

  1. 字典的排序与遍历

    • 首先,对传入的字典的所有 key 进行排序,确保每次拼接后的结果一致。
    • 遍历排序后的 key,根据对应的 value 类型分别处理:
      • 如果 value 是字典,则递归调用自身,将字典内容转换为字符串;
      • 如果 value 是数组,则调用数组处理方法;
      • 如果 value 是基本类型(例如数字或字符串),直接转换为字符串;
      • 其他类型则按默认方式拼接,最后兜底。
  2. 数组的递归拼接

    • 数组中的每个元素可能又是字典或数组,需要递归调用对应的方法。
    • 每个元素转换后,通过逗号分隔,并在结束时移除多余的逗号。
  3. 格式规范

    • 字典的 key-value 对之间使用 & 符号分隔;
    • 数组的元素间使用 , 分隔,并在嵌套拼接时加上 {}[] 表示不同的数据结构。

代码实现

下面是完整的代码实现,并附有详细注释:


import Foundationclass SignTool {// 类方法,接收一个字典作为参数,返回拼接好的字符串class func concatenate(dictionary: [String: Any]) -> String {// 对字典的key进行排序let sortedKeys = dictionary.keys.sorted()var result = ""// 遍历排序后的keyfor (index, key) in sortedKeys.enumerated() {if let value = dictionary[key] {// 如果value是字典类型,递归调用concatenate方法if let valueDict = value as? [String: Any] {result += "\(key)={\(self.concatenate(dictionary: valueDict))}"// 如果value是数组类型,递归调用concatenate方法} else if let valueArray = value as? [Any] {result += "\(key)=[\(self.concatenate(array: valueArray))]"// 如果value是NSNumber类型,直接拼接} else if let numberValue = value as? NSNumber {result += "\(key)=\(numberValue)"// 如果value是字符串类型,直接拼接} else if let stringValue = value as? String {result += "\(key)=\(stringValue)"// 其他类型的value,直接拼接} else {result += "\(key)=\(value)"}}// 在key-value对之间添加&符号if index < sortedKeys.count - 1 {result += "&"}}return result}// 私有类方法,接收一个数组作为参数,返回拼接好的字符串private class func concatenate(array: [Any]) -> String {var result = ""// 遍历数组中的每个元素for value in array {// 如果元素是字典类型,递归调用concatenate方法if let valueDict = value as? [String: Any] {result += "{\(self.concatenate(dictionary: valueDict))},"// 如果元素是数组类型,递归调用concatenate方法} else if let valueArray = value as? [Any] {result += "[\(self.concatenate(array: valueArray))],"// 如果元素是NSNumber类型,直接拼接} else if let numberValue = value as? NSNumber {result += "\(numberValue),"// 如果元素是字符串类型,直接拼接} else if let stringValue = value as? String {result += "\(stringValue),"// 其他类型的元素,直接拼接} else {result += "\(value),"}}// 移除最后的逗号if result.hasSuffix(",") {result.removeLast()}return result}
}

实际效果

通过上述实现,可以将复杂的字典与数组数据转换为统一的字符串格式。例如:

输出结果类似于:

a={age=20.124&e=5&f=[6,7]&student=1&teacher=0&uid=8}&b=[1,{c=3&d=4}]&image=[10,11,12,15]

其他测试用例及代码:


class SignToolTests: NSObject {public static func test() {print("start test")let test = SignToolTests()test.testConcatenateWithSimpleDictionary()test.testConcatenateWithNestedDictionary()test.testConcatenateWithArray()test.testConcatenateWithNestedArray()test.testConcatenateWithComplexStructure()test.testConcatenate()test.testMax()print("end test")}func testConcatenateWithSimpleDictionary() {let dictionary: [String: Any] = ["b": 2, "a": 1]let result = SignTool.concatenate(dictionary: dictionary)XCTAssertEqual(result, "a=1&b=2")}func testConcatenateWithNestedDictionary() {let dictionary: [String: Any] = ["b": ["d": 4, "c": 3], "a": 1]let result = SignTool.concatenate(dictionary: dictionary)XCTAssertEqual(result, "a=1&b={c=3&d=4}")}func testConcatenateWithArray() {let dictionary: [String: Any] = ["b": [1, 2, 3], "a": 1]let result = SignTool.concatenate(dictionary: dictionary)XCTAssertEqual(result, "a=1&b=[1,2,3]")}func testConcatenateWithNestedArray() {let dictionary: [String: Any] = ["b": [1,["d": 4,"c": 3]],"a": 1]let result = SignTool.concatenate(dictionary: dictionary)XCTAssertEqual(result, "a=1&b=[1,{c=3&d=4}]")}func testConcatenateWithComplexStructure() {let dictionary: [String: Any] = ["b": [1,["d": 4, "c": 3]],"a": ["e": 5,"f": [6, 7]]]let result = SignTool.concatenate(dictionary: dictionary)XCTAssertEqual(result, "a={e=5&f=[6,7]}&b=[1,{c=3&d=4}]")}func testConcatenate() {let dictionary: [String: Any] = ["b": [1,["d": 4, "c": 3]],"a": ["e": 5,"f": [6, 7],"uid": 8,"age": 20.124,"student": true,"teacher": false,],"image": ["10", "11", "12", "15"],]let result1 = SignTool.concatenate(dictionary: dictionary)// 把这个字典转出josn字符串,然后再转回字典,看看是否和原来的字典一样let jsonData = try! JSONSerialization.data(withJSONObject: dictionary, options: [])let jsonString = String(data: jsonData, encoding: .utf8)!let dict = try! JSONSerialization.jsonObject(with: jsonData, options: []) as! [String: Any]let result2 = SignTool.concatenate(dictionary: dict)print("jsonString",jsonString)print("result1",result1)print("result2",result2)XCTAssertEqual(result1, result2)}func testMax() {let dictionary: [String: Any] = ["b": [1,["d": 4, "c": 3]],"a": ["e": 5,"f": [6, 7],"uid": 8,"age": 20.124,"student": true,"teacher": false,"dic":["roomID":"123","author":"gcs",]],"image": ["10", "11", "12", "15"],"array":[[1,2,3],["1","2","3"],["roomID":"123","author":"gcs"],["roomID":"1234","author":"g"],]]let result1 = SignTool.concatenate(dictionary: dictionary)// 把这个字典转出josn字符串,然后再转回字典,看看是否和原来的字典一样let jsonData = try! JSONSerialization.data(withJSONObject: dictionary, options: [])let jsonString = String(data: jsonData, encoding: .utf8)!let dict = try! JSONSerialization.jsonObject(with: jsonData, options: []) as! [String: Any]let result2 = SignTool.concatenate(dictionary: dict)print("jsonString",jsonString)print("result1",result1)print("result2",result2)XCTAssertEqual(result1, result2)}@discardableResultfunc XCTAssertEqual(_ str1: String, _ str2: String) -> Bool {if str1 == str2 {print("✅")return true}print("❌ Expected: \(str1) but got: \(str2)")return false}}

http://www.dtcms.com/wzjs/92430.html

相关文章:

  • 宁波住房和城乡建设委员会官方网站2023最新15件重大新闻
  • 做公司网站协议书模板下载跨境电商网站开发
  • 网站开发 图片铺满广东网站seo
  • 做网站上传的图片显示变形青岛网站
  • 建设银行网上银行官方网站网络营销是什么课程
  • 杨浦企业网站建设好用的搜索引擎
  • 杭州seo排名收费相关搜索优化软件
  • 开个网站做英语培训seo是什么味
  • 给一个网站怎么做安全测试地推的60种方法
  • dw如何做网站自动推广软件免费
  • 河北石家庄网站建设哈尔滨最新疫情
  • 做窗帘的厂家网站广州日新增51万人
  • 山东省住房与城乡建设网站企业网站模板
  • 找网站做网站做网站企业建站 平台
  • 哈尔滨做网站seo北京网站优化快速排名
  • 帝国cms怎样做网站迁移十大最免费软件排行榜
  • 成都网站建设开发公seo效果分析
  • dedecms网站的下载百度seo
  • 宜春市城乡规划建设局网站西安网站seo诊断
  • 个人网站如何快速通过icp备案外贸网站建设推广
  • 网站开发报价单模板全网营销推广 好做吗
  • b站推广网站入口无病毒如何制作企业网站
  • 群晖ds216j能否做网站seo基本概念
  • 基于工作过程的商务网站建设 网页制作免费有效的推广平台
  • 数据库与动态网站开发实验报告福州网seo
  • 各大网站提交入口网络营销是什么专业
  • 菏泽 兼职做网站seo 知乎
  • app导航网站源码seo还有未来吗
  • g点网站建设工作室收录网站排名
  • 二手书网站开发需求分析企业培训机构排名