python中Json编码的dict和golang中的map不匹配

2024-03-28 20:25:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用json生成一个json编码的python dict的HMAC、sha256散列。我们称之为hash1。这是我随JWT寄来的签名。然后我想在Go的另一个服务中验证这个签名。我正在使用映射中的数据(与python dict相同)、json编码和散列(hash2) 但是,hash1和hash2是不同的。 我了解到这是由于pythonjson在dict中的元素之间添加了空间,golangjson库没有添加任何空间。 我有办法解决这个问题吗?你知道吗

some_data = {'a':1, 'b':2}
json_str1 = json.dumps(some_data, sort_keys=True)
some_data := map[string]int{"a":1, "b":2}
json_str2 = json.Marshal(some_data)

编辑: 正如其中一个答案中所建议的,在json.dumps文件会解决问题的。不幸的是, 我不拥有python端代码,因此无法在那里进行更改。你知道吗


Tags: 数据jsongo编码data空间somehmac
3条回答

json.Marshal不字符串化。它以字节为单位返回json编码。你知道吗

如果需要字符串转换,可以使用以下命令。你知道吗

b, _ := json.Marshal(some_data)
json_str2 := str(b)

因为json.dumps在字段值之间添加了一个额外的空格,所以可以使用下面的方法向json字符串化文件添加一个额外的空格

str := string(b)

fmt.Println(str)
c := strings.Join(strings.Split(str, ","), ", ")
fmt.Println(c)

如果存在逗号为","的字符串值,则使用此分隔符可能会失败。你知道吗

为了确保不给包含逗号的字符串添加任何空格,可以使用marshalIndent

data, err := json.MarshalIndent(some_data, "", "delimiter")
if err != nil {
    panic(err)
}
fmt.Println(string(data))

s := strings.Replace(string(data), "\ndelimiter", " ", -1)
s = strings.Replace(s, "{ ", "{", -1) 
s = strings.Replace(s, "\n}", "}", -1) 

Python输出

json_str1 = json.dumps(some_data, sort_keys=True)


{"a": 1, "b": 2}

Go output

{"a": 1, "b": 2}

golang中的Json库有一个MarshalIndent函数来解决这个问题。你知道吗

我不能对Go说什么,但是当我在javascript中生成hash时,我也遇到了同样的问题。您需要使用一些分隔符,比如json.dumps(data, separators=(',', ':')).encode('utf-8') 会有用的。你知道吗

相关问题 更多 >