go json 序列化问题

go json 序列化特殊字符处理方案

两种方法解决

  • 将value 转为 16进制或base64,服务端单独做一层解码

    go
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    
    	bt := []byte{230,136}
    	hexStr := hex.EncodeToString(bt)
    	args := map[string]string{}
    	args["a"] = hexStr
    
    	fmt.Printf("a %v\n",bt)
    	println("len a", len(bt))
    
    	input, err := json.Marshal(args)
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	var decodeArgs map[string]string
    
    	err =json.Unmarshal(input, &decodeArgs)
    	if err != nil {
    		return
    	}
    
    	b, err := hex.DecodeString(decodeArgs["a"])
    
    	if err != nil {
    		return
    	}
    	fmt.Println("b", b)
    	fmt.Println("len b", len(b))
    
    // output
    a [230 136]
    len a 2
    b [230 136]
    len b 2
  • 服务端声明一个对应的接收struct

    go
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    
    type  tb struct {
    	Bytes []byte
    }
    
    
    func test() {
    	bt := []byte{230,136}
    	args := tb{Bytes: bt}
    	fmt.Printf("a %v\n",bt)
    	println("len a", len(bt))
    
    	input, err := json.Marshal(args)
    	if err != nil {
    		fmt.Println(err)
    	}
    
    	var decodeArgs tb
    
    	err =json.Unmarshal(input, &decodeArgs)
    	if err != nil {
    		return
    	}
    
    	if err != nil {
    		return
    	}
    	fmt.Println("b", decodeArgs.Bytes)
    	fmt.Println("len b", len(decodeArgs.Bytes))
    }
    
    // output
    a [230 136]
    len a 2
    b [230 136]
    len b 2
山外风雨三尺剑,有事提剑下山去
Built with Hugo
主题 StackJimmy 设计