如何将带有umlauts的字符串转换回JSON

3

我有一个JSON Python字符串:

linklist = str('
{
   "Download":{
   "Test": "http://www.test.org",
   u"K\xf6ter": "http://www.koeter.de"}
}'
)

我想使用:

myJson= json.loads(linklist)

但我遇到了一个问题,因为JSON字符串中有德语umlaut字符

什么是最好的编码/解码方式,以便将该字符串转换为有效的JSON对象(使用simplejson)

嘿,伙计们,这就是我在我的代码中想要做的:

JSON:links.json

{
 "Download":{
    "Link1ä":"http://www.link1.de/test",
    "Link2ö":"http://www.link2.de/test/cool",
    "Link3ü":"http://www.link3.de/test/foo/bar",
    "Link4ü":{"Link5ü":"http://www.link5.de/test"}
}
}

Python文件:

linksFile = open('links.json', 'r')
linksList = json.load(linksFile)

在这个链接列表(linksList)中,我想要搜索test并将其替换为myTest。

如何在这个JSON对象的链接列表(linksList)中将所有的字符串 -> test -> myTest进行替换?

非常感谢您的帮助。我尝试使用以下方法对JSON对象进行替换,并且没有遇到umlauts的问题:

linksFile = open('links.json', 'r')
linksList = json.load(linksFile)
dump = json.dumps(linksList)
linksList = json.loads(dump.replace('toReplace', 'replacement'))

你是如何获取到这个字符串的? - user395760
@delnan 是的,他的字符串不太对,但是(utf-8 json)> json.loads > json.dumps 和(包含UTF-8 str的Python列表)> json.dumps > json.loads 看控制台输出至少不是对称操作。至少对我而言,经过了谷歌的尽责调查,也找不到一个解释。这两个操作都似乎给你一个unicode / UTF-16表示,而不是UTF-8。即使在dumpsloads中显式使用encoding ='utf-8',也是如此。 - Silas Ray
1个回答

1
如果该字符串是Köter,那么你的问题在于编码,而不是json(de)序列化。看起来你正在使用cp1250。
尝试明确指定编码(默认编码为UTF-8,显然不适用于你的情况):
myJson = json.loads(linklist, 'cp1250')

这里没有什么真正表明他在使用cp1250。他JSON字符串中的键以“u”为前缀,表明无论他从哪里获取此字符串,都已经正确解码或最初将ö作为“unicode”源。如果没有更多信息(错误/调用堆栈或此代码来自何处的原始代码),就无法确定源编码是什么,更不用说编码是否导致了问题。 - Silas Ray
事实上,我没有注意到u''前缀。我从lennykey说它是一个分音符号和'\xf6'代表cp1250中的ö这一事实推断出代码页。 - Ihor Kaharlichenko
JSON字面量是非Unicode的,除非使用Python 3(因为没有u''前缀)。因此,'\xf6'代表一个单字节,它不能用于双字节编码,如UTF-16(无论是小端还是大端)。无论如何,u"这种东西会使整个JSON字符串无效,无论编码如何。 - Ihor Kaharlichenko
抱歉,你说得对。我看的是dumpsloads的输出,它们确实给出了UTF-16表示。可能是JSONDecode或其他什么东西在做这件事,因为我找不到另一种从Python中获取该表示的方法。 - Silas Ray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接