【问题标题】:Python : How to write json formatted string in json filePython:如何在 json 文件中写入 json 格式的字符串
【发布时间】:2020-07-26 05:46:03
【问题描述】:

我有一个要求,我必须在文件中写入一些 JSON 字符串。

例如,我有下面的字符串

我的python代码:

 S = '''{
"K1": "v1",
"K2" : "\nv2"
}'''

当我尝试使用 json.dumps(s) 将其写入 json 文件时,它会被写入如下文件:

"{\"k1\" : \"v1\",\"k2\" : \"\\nv2\"}"

而我需要它是这样的:

 {
"K1": "v1",
"K2" : "\nv2"
}

在 json 文件中。

如果我将字符串声明为以 r 开头的原始字符串,我可以实现这一点,但在实际场景中,我无法声明原始字符串,因为我在 python 变量中获取字符串值。

注意:我的 json 字符串值中有多个转义序列,如上述 json 结构中键 k2 的值。

如果有人帮助我生成具有所需 json 格式的正确 json 文件,将不胜感激。提前致谢。

【问题讨论】:

  • stackoverflow.com/questions/25242262/… -- 可能的解决方案
  • @Rajat Mishra - 它对我不起作用,因为我无法将字符串数据转换为字典。有什么方法可以创建以原始字符串为值的变量?

标签: json python-3.x escaping


【解决方案1】:

将变量声明为

S = {
"K1": "v1",
"K2" : "\nv2"
}

然后它会工作。例如:

In [16]: s
Out[16]: {'K1': 'v1', 'K2': '\nv2'}

In [17]: st = json.dumps(s)

In [18]: st
Out[18]: '{"K1": "v1", "K2": "\\nv2"}'

In [19]: s1 = '''{
    ...: "K1": "v1",
    ...: "K2" : "\nv2"
    ...: }'''

In [20]: st1 = json.dumps(s1)

In [21]: st1
Out[21]: '"{\\n\\"K1\\": \\"v1\\",\\n\\"K2\\" : \\"\\nv2\\"\\n}"'

更新:如果您的数据以字符串形式出现,请先使用 json.loads() 将其转换为字典。例如:

In [24]: st
Out[24]: '{"K1": "v1", "K2": "\\nv2"}'

In [25]: json.loads(st)
Out[25]: {'K1': 'v1', 'K2': '\nv2'}

In [26]: json.dumps(json.loads(st))
Out[26]: '{"K1": "v1", "K2": "\\nv2"}'

【讨论】:

  • 我无法将字符串声明为字典。数据以字符串形式出现。
  • 在这种情况下,使用 json.loads() 将字典字符串转换为字典。
  • 感谢我使用带有严格标志的 json.loads() 并且它有效!
【解决方案2】:

我使用以下修改 python3.6 代码使其满足我的特定要求:

py_string = '''{ "k1":"v1","k2":"\nv2"}'''
valid_json_string = json.dumps(json.loads(py_string ,strict=False))
with open('test.json', 'w') as outfile:
     json.dump(valid_json_string, outfile)

通过这行代码,我能够在 json 文件中写入这个 json 字符串,而无需转义双引号和字符串。

基本上,当我们将json内容直接粘贴到python字符串中时,python不会允许string中的json有效控制字符。python字符串会转义特殊控制字符,如\n将视为换行符。

所以要在 python 字符串中允许它 json.loads() 支持“严格”标志。 如果 strict 为 false(默认为 True),则字符串中将允许使用控制字符。此上下文中的控制字符是字符代码在 0-31 范围内的字符,包括“\t”(制表符)、“\n”、“\r”和“\0”。

更多信息 - https://docs.python.org/3/library/json.html

【讨论】:

    【解决方案3】:

    如果你想要一个简单的方法,你可以使用jsonwriter
    例如:

    # pip install jsonwriter
    from jsonwriter import file
    
    file = file('yourfilename.json', autosave=True)
    
    file.set('K1', 'v1')
    file.set('K2', '\nv2')
    # And it will be saved automatically
    

    更多信息请查看jsonwriter docs

    【讨论】:

    • 这个模块比使用内置的json python 模块有什么好处?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多