如果字符串包含\ n,我如何将字符串加载到JSON对象中?

时间:2013-03-22 00:56:31

标签: python json python-2.7

我需要将包含JSON格式文本的UTF-8数据文件中的一些文本加载到JSON对象中,然后解析它。我无法控制文件的内容或格式,必须处理我给出的内容。我也无法控制Python版本,即2.7。

此文本文件中至少有一个值包含\ n。因此,运行脚本将导致如下错误:Expecting,delimiter:第8行第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)

我尝试了以下内容:

  1. json.loads(data.replace('\n','\\n')文本文件包含~15,000 字符,所以这只会导致脚本挂起。
  2. json.loads("%r"%d)其中d是包含字符串的变量。这导致错误'没有JSON对象可以被解码'因为它将文件中的每个换行符转换为\ n,这不是需要发生的事情。
  3. 如何将此字符串加载到JSON对象中?

1 个答案:

答案 0 :(得分:0)

json字符串可能包含\n(两个字符)。因此,如果您在文件\n中看到;没关系。

有效的json(如文件中所示(不是Python源代码)):

["line\nanother"]

无效:

["line
another"]

如果将文件内容包含为Python字符串 literal ,则可能会出现混淆。在这种情况下,\n在获得json解析器之前也会被Python解释。要避免它,请使用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())