编码和序列化代码给出不同的结果 C# 和 Python
Encoding and Serialization Code Gives Different Result C# and Python
我尝试将此 C# 代码(编码和序列化)转换为 Python,但结果不同。为什么?
var dictt = new Dictionary<string, object>
{
{ "aaa", "6mjDx3Cya4JvbTLMenPpXA==" },
{ "bbb", "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="},
};
JavaScriptSerializer serialzr = new JavaScriptSerializer();
return Convert.ToBase64String(Encoding.UTF8.GetBytes(serialzr.Serialize(dictt))); //eyJpdiI6IjZtakR4M0N5YTRKdmJUTE1lblBwWEE9PSIsInZhbHVlIjoiNFU1TStWMnlvSUE3cldqNDZyZGhUQmdwRWpmMXpZSzBtMTFsRE03RFJDST0ifQ==
dictt = {
"aaa": "6mjDx3Cya4JvbTLMenPpXA==",
"bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="
}
y = json.dumps(dictt)
#y= {"aaa": "6mjDx3Cya4JvbTLMenPpXA==", "bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
json_object = json.loads(y) #convert it to json, like serialize in C#
# json_object = {'aaa': '6mjDx3Cya4JvbTLMenPpXA==', 'bbb': '4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI='}
json_object_utf8_encoded = str(json_object).encode('utf8') #encode utf8
#json_object_utf8_encoded = b"{'aaa': '6mjDx3Cya4JvbTLMenPpXA==', 'bbb': '4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI='}"
json_base64 = base64.b64encode(json_object_utf8_encoded) #convert to base64 string
#json_base64 = "b'eydpdic6ICc2bWpEeDNDeWE0SnZiVExNZW5QcFhBPT0nLCAndmFsdWUnOiAnNFU1TStWMnlvSUE3cldqNDZyZGhUQmdwRWpmMXpZSzBtMTFsRE03RFJDST0nfQ=='"
json_base64_str = json_base64.decode("utf-8")
return json_base64_str
#eydpdic6ICc2bWpEeDNDeWE0SnZiVExNZW5QcFhBPT0nLCAndmFsdWUnOiAnNFU1TStWMnlvSUE3cldqNDZyZGhUQmdwRWpmMXpZSzBtMTFsRE03RFJDST0nfQ==
以下两个 python 命令之间存在细微差别,导致两个不同的输出:"
与 '
。
而这个:
serialized = json.dumps(dict)
print(serialized)
输出:
{"aaa": "6mjDx3Cya4JvbTLMenPpXA==", "bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
这个:
serialized = json.dumps(dict)
deserialized = json.loads(serialized)
print(str(deserialized))
输出:
{'aaa': '6mjDx3Cya4JvbTLMenPpXA==', 'bbb': '4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI='}
您使用后一个:您不必要地反序列化 json,然后对其调用 str
,从而得到不同的结果。只需删除 json.loads
步骤。
编辑:
返回值(C# vs python)仍然不会匹配,因为 C# 序列化程序(无论是 JavaScriptSerializer
还是更常见的 Newtonsoft JsonConvert.Serialize
)输出一个 json 没有空格:
{"aaa":"6mjDx3Cya4JvbTLMenPpXA==","bbb":"4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
而 python 的 json.dumps
输出带空格的 json:
{"aaa": "6mjDx3Cya4JvbTLMenPpXA==", "bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
即使您将缩进参数传递给 json.dumps
(例如,json.dumps(dict, indent=2)
),您也不能使用 JavaScriptSerializer
执行此操作,尽管您可以使用Newtonsoft 的 JsonConvert.Serialize
它仍然无法工作,因为后者使用 CRLF 字符进行缩进,而 python 则没有。
话虽这么说,但没关系,因为逻辑输出是相同的:序列化字典的 Base64 编码。
我尝试将此 C# 代码(编码和序列化)转换为 Python,但结果不同。为什么?
var dictt = new Dictionary<string, object>
{
{ "aaa", "6mjDx3Cya4JvbTLMenPpXA==" },
{ "bbb", "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="},
};
JavaScriptSerializer serialzr = new JavaScriptSerializer();
return Convert.ToBase64String(Encoding.UTF8.GetBytes(serialzr.Serialize(dictt))); //eyJpdiI6IjZtakR4M0N5YTRKdmJUTE1lblBwWEE9PSIsInZhbHVlIjoiNFU1TStWMnlvSUE3cldqNDZyZGhUQmdwRWpmMXpZSzBtMTFsRE03RFJDST0ifQ==
dictt = {
"aaa": "6mjDx3Cya4JvbTLMenPpXA==",
"bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="
}
y = json.dumps(dictt)
#y= {"aaa": "6mjDx3Cya4JvbTLMenPpXA==", "bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
json_object = json.loads(y) #convert it to json, like serialize in C#
# json_object = {'aaa': '6mjDx3Cya4JvbTLMenPpXA==', 'bbb': '4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI='}
json_object_utf8_encoded = str(json_object).encode('utf8') #encode utf8
#json_object_utf8_encoded = b"{'aaa': '6mjDx3Cya4JvbTLMenPpXA==', 'bbb': '4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI='}"
json_base64 = base64.b64encode(json_object_utf8_encoded) #convert to base64 string
#json_base64 = "b'eydpdic6ICc2bWpEeDNDeWE0SnZiVExNZW5QcFhBPT0nLCAndmFsdWUnOiAnNFU1TStWMnlvSUE3cldqNDZyZGhUQmdwRWpmMXpZSzBtMTFsRE03RFJDST0nfQ=='"
json_base64_str = json_base64.decode("utf-8")
return json_base64_str
#eydpdic6ICc2bWpEeDNDeWE0SnZiVExNZW5QcFhBPT0nLCAndmFsdWUnOiAnNFU1TStWMnlvSUE3cldqNDZyZGhUQmdwRWpmMXpZSzBtMTFsRE03RFJDST0nfQ==
以下两个 python 命令之间存在细微差别,导致两个不同的输出:"
与 '
。
而这个:
serialized = json.dumps(dict)
print(serialized)
输出:
{"aaa": "6mjDx3Cya4JvbTLMenPpXA==", "bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
这个:
serialized = json.dumps(dict)
deserialized = json.loads(serialized)
print(str(deserialized))
输出:
{'aaa': '6mjDx3Cya4JvbTLMenPpXA==', 'bbb': '4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI='}
您使用后一个:您不必要地反序列化 json,然后对其调用 str
,从而得到不同的结果。只需删除 json.loads
步骤。
编辑:
返回值(C# vs python)仍然不会匹配,因为 C# 序列化程序(无论是 JavaScriptSerializer
还是更常见的 Newtonsoft JsonConvert.Serialize
)输出一个 json 没有空格:
{"aaa":"6mjDx3Cya4JvbTLMenPpXA==","bbb":"4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
而 python 的 json.dumps
输出带空格的 json:
{"aaa": "6mjDx3Cya4JvbTLMenPpXA==", "bbb": "4U5M+V2yoIA7rWj46rdhTBgpEjf1zYK0m11lDM7DRCI="}
即使您将缩进参数传递给 json.dumps
(例如,json.dumps(dict, indent=2)
),您也不能使用 JavaScriptSerializer
执行此操作,尽管您可以使用Newtonsoft 的 JsonConvert.Serialize
它仍然无法工作,因为后者使用 CRLF 字符进行缩进,而 python 则没有。
话虽这么说,但没关系,因为逻辑输出是相同的:序列化字典的 Base64 编码。