go 自己写序列化函数不转义
以map[int32]string转化为[]byte为例
背景:算法传给我一个map[int32]string类型的值(map的值本身是json转化成的string),我需要把这个值生成一个文件上传到OSS,但是发现通过url下载下来的文件里面有转义字符。
原因:直接通过json.json.Marshal(),最后肯定会发生转义的。
解决:搜索了一些方式发现都是会有转移的,所以决定自己写一个Marshal()。
package main
import (
"encoding/json"
"fmt"
)
type RawString string
func (r RawString) MarshalJSON() ([]byte, error) {
return []byte(r), nil
}
type RawBadCaseResult map[int32]RawString
func toRawResult(reviewResult map[int32]string) RawBadCaseResult {
res := make(map[int32]RawString)
for k, v := range reviewResult {
res[k] = RawString(v)
}
return res
}
func main() {
result := make(map[int32]string)
result1 := make(map[string]string)
result1["name"] = "zhang"
result1["age"] = "20"
result2 := make(map[string]string)
result2["name"] = "huang"
result2["age"] = "20"
bytes1, err := json.Marshal(result1)
if err != nil {
fmt.Println(err)
}
bytes2, err := json.Marshal(result2)
if err != nil {
fmt.Println(err)
}
result[1] = string(bytes1)
result[2] = string(bytes2)
rawReviewResult := toRawResult(result)
var ReviewResultBytes []byte
// 最后生成文件的时候传入的是ReviewResultBytes,通过url下载的文件没有转义字符了。
ReviewResultBytes, err = json.Marshal(rawReviewResult)
if err != nil {
fmt.Println(err)
}
fmt.Println(string(ReviewResultBytes))
}