编码和序列化代码给出不同的结果 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 编码。