Golang中JSON编码与Base64编码的实现方法

Golang中JSON编码与Base64编码的实现方法 你好, 我的朋友给了我一个用Golang完成的任务,但我无法完成。有人能帮忙吗? 我有PHP代码,但我想用GoLang重写它。

任务要求是获取当前日期时间,然后将其转换为base64,再将这个base64输出转换为JSON。 在编码为JSON时,我们还需要处理一些特殊字符。

我的朋友给了我用于在PHP中解码的代码,但我的任务是理解如何解码,然后尝试通过理解解码过程在GOLang中实现相同的编码。我希望你们能理解 -_-

以下是解码的代码:

$lol = "G7C5w3hJ9nR+uI0i/AwO/nuH1Iw+Eu";
   $lol = trim($lol);
   
   
   $default = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
        $custom = "BSeI0grQ9Cmt/1oduh8AsF23wvZjpfGENx+n5JPMRYLDWqlVXy7zTHicO4UkKba6";
        
        $lolc = base64_decode(strtr($lol, $custom, $default));
        $lol = json_decode($lolc, true);
        $date=date_create($lol['date']);

这些是PHP代码,但很容易理解。$ 表示变量。 首先,$lol 是一个经过base64和json编码的字符串,我们将其转换为日期。 现在我们需要获取当前日期,然后使用PHP代码中给出的自定义字符将其转换为base64,接着我们需要将这个base64字符串编码为JSON。

请告诉我如何做到这一点。


更多关于Golang中JSON编码与Base64编码的实现方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中JSON编码与Base64编码的实现方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


package main

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	"strings"
	"time"
)

func customBase64Encode(data []byte) string {
	const defaultChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
	const customChars = "BSeI0grQ9Cmt/1oduh8AsF23wvZjpfGENx+n5JPMRYLDWqlVXy7zTHicO4UkKba6"
	
	// 标准base64编码
	encoded := base64.StdEncoding.EncodeToString(data)
	
	// 创建字符映射表
	charMap := make(map[byte]byte)
	for i := 0; i < len(defaultChars); i++ {
		charMap[defaultChars[i]] = customChars[i]
	}
	
	// 替换字符
	result := make([]byte, len(encoded))
	for i, ch := range encoded {
		if mapped, ok := charMap[byte(ch)]; ok {
			result[i] = mapped
		} else {
			result[i] = byte(ch)
		}
	}
	
	return string(result)
}

func main() {
	// 获取当前时间
	currentTime := time.Now()
	
	// 创建JSON数据
	data := map[string]string{
		"date": currentTime.Format("2006-01-02 15:04:05"),
	}
	
	// 编码为JSON
	jsonData, err := json.Marshal(data)
	if err != nil {
		panic(err)
	}
	
	// 使用自定义base64编码
	encoded := customBase64Encode(jsonData)
	
	// 输出结果
	fmt.Println("原始JSON:", string(jsonData))
	fmt.Println("自定义Base64编码:", encoded)
	
	// 验证解码(根据PHP代码逻辑)
	decoded := decodeFromPHPFormat(encoded)
	fmt.Println("解码验证:", decoded)
}

func decodeFromPHPFormat(encoded string) string {
	const defaultChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
	const customChars = "BSeI0grQ9Cmt/1oduh8AsF23wvZjpfGENx+n5JPMRYLDWqlVXy7zTHicO4UkKba6"
	
	// 创建反向映射
	charMap := make(map[byte]byte)
	for i := 0; i < len(customChars); i++ {
		charMap[customChars[i]] = defaultChars[i]
	}
	
	// 替换回标准base64
	standardBase64 := make([]byte, len(encoded))
	for i, ch := range encoded {
		if mapped, ok := charMap[byte(ch)]; ok {
			standardBase64[i] = mapped
		} else {
			standardBase64[i] = byte(ch)
		}
	}
	
	// base64解码
	decoded, err := base64.StdEncoding.DecodeString(string(standardBase64))
	if err != nil {
		panic(err)
	}
	
	return string(decoded)
}
// 处理JSON特殊字符的版本
func encodeWithSpecialChars() {
	currentTime := time.Now()
	
	// 创建包含特殊字符的数据
	data := map[string]interface{}{
		"date":    currentTime.Format(time.RFC3339),
		"message": "Special chars: \n\t\"quotes\" & 'apostrophes'",
		"value":   123.45,
	}
	
	// JSON编码(自动处理特殊字符)
	jsonData, err := json.Marshal(data)
	if err != nil {
		panic(err)
	}
	
	// 自定义base64编码
	encoded := customBase64Encode(jsonData)
	
	fmt.Println("包含特殊字符的JSON:", string(jsonData))
	fmt.Println("编码结果:", encoded)
}
// 完整示例:编码和解码
func fullExample() {
	// 编码过程
	now := time.Now()
	jsonStr := fmt.Sprintf(`{"date":"%s","status":"active"}`, now.Format("2006-01-02 15:04:05"))
	
	encoded := customBase64Encode([]byte(jsonStr))
	fmt.Printf("编码结果: %s\n", encoded)
	
	// 解码过程(模拟PHP代码逻辑)
	decodedJSON := decodeFromPHPFormat(strings.TrimSpace(encoded))
	
	var result map[string]interface{}
	json.Unmarshal([]byte(decodedJSON), &result)
	
	fmt.Printf("解码后的日期: %v\n", result["date"])
}
回到顶部