代码之家  ›  专栏  ›  技术社区  ›  Jason S

使用python生成json的C字符串文本

  •  1
  • Jason S  · 技术社区  · 14 年前

    我在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\"}"
    
    3 回复  |  直到 11 年前
        1
  •  2
  •   hughdbrown    14 年前

    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() 但翻译表最多只能将一个字符映射到一个字符。

        2
  •  3
  •   Community ahmed    7 年前

    你最初的建议和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 )

        3
  •  0
  •   kanaka    14 年前

    也许这就是你想要的:

    repr(json.dumps(mydict))