【问题标题】:using Python to generate a C string literal of JSON使用 Python 生成 JSON 的 C 字符串文字
【发布时间】:2011-04-29 09:04:26
【问题描述】:

我有一个 Python 字典,我想在 JSON 中序列化并转换为适当的 C 字符串,以便它包含与我的输入字典对应的有效 JSON 字符串。我正在使用结果在 C 源文件中自动生成一行。知道了?这是一个例子:

>>> import json
>>> mydict = {'a':1, 'b': 'a string with "quotes" and \t and \\backslashes'}
>>> json.dumps(mydict)
'{"a": 1, "b": "a string with \\"quotes\\" and \\t and \\\\backslashes"}'
>>> print(json.dumps(mydict))
{"a": 1, "b": "a string with \"quotes\" and \t and \\backslashes"}

我需要生成的是以下C字符串:

"{\"a\": 1, \"b\": \"a string with \\\"quotes\\\" and \\t and \\\\backslashes\"}"

换句话说,我需要在调用 json.dumps(mydict) 的结果上转义反斜杠和双引号。至少我认为我这样做......以下会起作用吗?还是我错过了一个明显的角落案例?

>>> s = '"'+json.dumps(mydict).replace('\\','\\\\').replace('"','\\"')+'"'
>>> print s
"{\"a\": 1, \"b\": \"a string with \\\"quotes\\\" and \\t and \\\\backslashes\"}"

【问题讨论】:

  • 您不想在 C 中定义字典。您想要一个可以解析以生成字典的语法为 C 的字符串?为什么不通过将结果存储在文件中并在运行时加载文件来解决整个问题呢?那你就不用逃避了。
  • 我不是在 C 中解析它。它是一个嵌入式系统,我将字符串逐字传输到 PC,在那里解析字符串。
  • ...实际上它比这更好,它也适用于将字符串存储在符号文件中的 DWARF 指令。我不能在运行时这样做;我的嵌入式系统无法访问文件系统。

标签: python string json escaping


【解决方案1】:

您最初的建议和来自 hughdbrown 的答案对我来说看起来是正确的,但我找到了一个略短的答案:

c_string = json.dumps( json.dumps(mydict) )

测试脚本:

>>> import json
>>> mydict = {'a':1, 'b': 'a string with "quotes" and \t and \\backslashes'}
>>> c_string = json.dumps( json.dumps(mydict) )
>>> print( c_string )
"{\"a\": 1, \"b\": \"a string with \\\"quotes\\\" and \\t and \\\\backslashes\"}"

这看起来正是你想要的正确的 C 字符串。

(幸运的是,Python 的“json.dumps()”直接通过正斜杠而不进行更改——不像某些 JSON 编码器在每个正斜杠前加上反斜杠。 比如Processing escaped url strings within json using python 中描述的那个)。

【讨论】:

  • 有趣!这很聪明。我不再从事这个项目,也无法再访问软件+测试用例,所以我不能轻易尝试。
【解决方案2】:

C 字符串以引号开头并以引号结尾,没有嵌入的空值,所有嵌入的引号都用反斜杠转义,并且所有嵌入的反斜杠文字都是双倍的。

因此,请使用您的字符串,将反斜杠加倍并用反斜杠转义引号。我认为您的代码正是您所需要的:

s = '"' + json.dumps(mydict).replace('\\', r'\\').replace('"', r'\"') + '"'

或者,您可以选择这个稍微不那么健壮的版本:

def c_string(s):
    all_chars = (chr(x) for x in range(256))
    trans_table = dict((c, c) for c in all_chars)
    trans_table.update({'"': r'\"', '\\': r'\\'})
    return "".join(trans_table[c] for c in s)

def dwarf_string(d):
    import json
    return '"' + c_string(json.dumps(d)) + '"'

我很想使用string.maketrans(),但翻译表最多可以将一个字符映射到一个字符。

【讨论】:

    【解决方案3】:

    也许这就是你想要的:

    repr(json.dumps(mydict))
    

    【讨论】:

    • 不,因为这不会转义双引号 " 字符。
    猜你喜欢
    • 2017-04-14
    • 2011-12-28
    • 2014-01-15
    • 2023-02-17
    • 2014-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    相关资源
    最近更新 更多