【问题标题】:Python JSON Functionality with raw strings带有原始字符串的 Python JSON 功能
【发布时间】:2023-02-10 01:07:25
【问题描述】:

我得到以下 json 变量(字符串):

var = somefunct()
print(var)

'{"data":{"threaded_conversation_with_injections_v2":{"source":"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>","user_id_str":"44196397"}}}'

当我尝试加载它时

json.loads(var)

我得到:json.decoder.JSONDecodeError: Expecting value:

但是,当我做那样的事情时手动:

new_var = r"""{"data":{"threaded_conversation_with_injections_v2":{"source":"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>","user_id_str":"44196397"}}}"""
json.loads(new_var)
{'data': {'threaded_conversation_with_injections_v2': {'source': '<a href="http://twitter.com/download/iphone" rel="nofollow">Twitter for iPhone</a>', 'user_id_str': '44196397'}}}

有用。 简单地说,它看起来像这样

a = """{"data":{"threaded_conversation_with_injections_v2":{"source":"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>","user_id_str":"44196397"}}}"""
b = r"""{"data":{"threaded_conversation_with_injections_v2":{"source":"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>","user_id_str":"44196397"}}}"""
json.loads(a) - ERROR
json.loads(b) - WORKS

当我有一些变量时,我该如何解决?

对于 json.loads 方法,如何将“var”变量中的内容设置为 r“content”?

UPD:在浪费了很多时间之后,我发现不可能获得我在示例中指示的字符串数据。感谢您的回答。问题已解决。

【问题讨论】:

  • 我认为 print(var) 显示您在 var 中的值被包裹在额外级别的字符串引号中......否则它不会在 '...' 之间输出
  • @Anentropic 当然,我非常理解这一点。问题是如何将相似的字符串转换为字典
  • 此外,它仅适用于变量b,因为您没有注意反斜杠键。如果你写“”“\”“”,python解释器不会理解你的意思。但是你写"""\\""",它会理解这是一个字符串。当写 r"""\""" 时,python 理解你实际上是指双斜杠。
  • 所以你应该把它放在变量a: """{"data":{"threaded_conversation_with_injections_v2":{"source":"<a href=\\"twitter.com/download/iphone\\" rel=\\"nofollow\ \">iPhone 版 Twitter</a>","user_id_str":"44196397"}}}"""
  • 您是生成从 somefunct 返回的 var 值的人吗?你最好的选择是首先获得有效的 JSON 数据,而不是被错误转义并用额外引号包裹的东西困住

标签: python json


【解决方案1】:

我有同样的问题,我尝试了很多方法,例如var = var.encode('unicode_escape'),或使用.encode('utf-8'),但我能找到的唯一解决方案是使用:

var = rf"{var}"
var_dict = json.loads(var)
# previous 2 lines combined in one:  var_dict = json.loads(rf"{var}") 

【讨论】:

    【解决方案2】:

    如果您使用json.loads(json.dumps(var)),那么它将起作用。 原因是您在导致错误的 data.threaded_conversation_with_injections_v2.source 的值中有 "

    【讨论】:

    • 不,它不会工作。如您所知,“loads”返回一个字典,而不是一个字符串。
    • @fer0m 这就是我在 json.loads 中使用 json.dumps 的原因。我对其进行了测试,它可以与您使用的相同 var 一起使用。如果你解释我们需要什么,我们可能会帮助你
    • json.dumps() 采用字典,而不是字符串,var 是一个字符串。请参阅此处了解 json.dumps() 的用法示例:docs.python.org/3/library/json.html
    • @jjramsey json.dumps 将 Serialize obj 转换为 JSON 格式的 str 它可以接受 str 并将其转换为格式化的 str 没有问题,请自己尝试。如果目标是将 str 转换为 dict 但 str 格式不正确,那么您可以使用 json.dumps 将其转换为格式化的 str 然后 json.loads 将其转换为 dict
    • 指出 json.dumps() 需要的不仅仅是字典。也就是说,它将 Python 对象转换为 JSON 中相应的字符串类似物,因此 json.dumps([]) 返回字符串 "[]",而 json.dumps('foo""') 返回字符串 "foo"""。如果您向 json.dumps() 提供一个恰好是格式错误的 JSON 表达式的字符串,它将将该字符串视为任何其他字符串,转义 " 等特殊字符,但不会将其转换为有效的 JSON 表示形式。您的方法似乎有效主要是运气和对 json.dumps() 预期功能的“滥用”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2021-08-03
    相关资源
    最近更新 更多