如何将包含\n的字符串加载到JSON对象中?
我需要从一个UTF-8格式的数据文件中加载一些文本,这些文本是以JSON格式存储的,然后把它转成一个JSON对象,接着进行解析。这个文件的内容和格式我无法控制,只能处理我得到的内容。而且我使用的Python版本是2.7,也无法更改。
这个文本文件中的至少一个值包含了\n这个字符。因为这个原因,运行脚本时会出现这样的错误:Expecting , delimiter: line 8 column 102 (char 470)。
文件的内容看起来是这样的:
{
"key1": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
"key2": "Suspendisse eu tincidunt velit. Proin mollis ligula a arcu feugiat ac imperdiet nunc sagittis. Etiam egestas fringilla tristique.\nCurabitur interdum dolor eu velit gravida et convallis purus facilisis. Aenean eu enim mi.",
"key3": "Nunc intérdum mågna nec nîbh faucibus non laoreet nisi blandit. Nunc lobortis ligula ut tellus semper in hendrerit mauris malesuada.",
"key4": "Vivamus erat turpis, fringilla id sollicitudin non, pellentesque vel lacus. Praesent placerat dapibus mauris vel hendrerit. Integer a augue leo, facilisis viverra dui. Maecenas sollicitudin adipiscing viverra. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vestibulum commodo diam, vitae ultrices quam viverra eu. Proin eros sapien, scelerisque non condimentum vel, placerat at est. Ut fermentum mattis lacus, a eleifend ipsum euismod ac. Quisque mollis bibendum quam nec sollicitudin."
}
相关代码:
def processText(stringData):
j = json.loads(data, encoding='utf-8')
# do stuff that I can't change
dataFile = codecs.open('/path/to/file', 'r', 'utf-8')
data = dataFile.read()
dataFile.close()
processText(data)
我尝试过以下方法:
json.loads(data.replace('\n','\\n')这个文本文件大约有15,000个字符,所以这个方法导致脚本卡住了。json.loads("%r"%d)这里的d是包含字符串的变量。这个方法导致了错误'No JSON object could be decoded',因为它把文件中的每个换行符都转换成了\n,这样是不对的。
我该如何把这个字符串加载到一个JSON对象中呢?
相关问题:
2 个回答
-1
在使用 json.loads() 的时候,可以把 strict=False 设置上:
body_unicode = request.body.decode('utf-8')
body = json.loads(body_unicode,strict=False)
0
json 字符串中可能会包含 \n(这实际上是两个字符)。所以如果你在文件中看到 \n,这没问题。
有效的 json(在文件中看到的,不是 Python 源代码):
["line\nanother"]
无效的:
["line
another"]
如果你把文件内容作为 Python 字符串 字面量 来使用,可能会引起混淆。在这种情况下,\n 也会被 Python 先处理,然后再传给 json 解析器。为了避免这种情况,可以使用 r'' 字面量:
json_text = r'["line\nanother"]'
print(json_text) # -> ["line\nanother"]
d = json.loads(json_text)
如果你是从文件中读取 json;你不需要做任何处理(\n 只是另外两个字节;你会原样得到它们):
with open(filename) as file: # don't need `codecs` if file is in utf-8
d = json.load(file)
# analog of: d = json.loads(file.read())