编码和序列化代码在C#和Python中给出不同的结果

2024-05-15 03:20:57 发布

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

我试图将这个C代码(编码和序列化)转换为Pyhton,但结果不同。为什么?

    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==

Tags: jsonnewstringreturnobjectutf8bbbencoded
1条回答
网友
1楼 · 发布于 2024-05-15 03:20:57

以下两个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编码

相关问题 更多 >

    热门问题