使用Python生成JSON的C字符串文本

使用Python生成JSON的C字符串文本,python,string,json,escaping,Python,String,Json,Escaping,我有一个Python字典,我想用JSON序列化它,并将其转换为正确的C字符串,以便它包含一个与我的输入字典对应的有效JSON字符串。我正在使用结果在C源文件中自动生成一行。知道了?下面是一个例子: >>> import json >>> mydict = {'a':1, 'b': 'a string with "quotes" and \t and \\backslashes'} >>> json.dumps(mydict) '{"a": 1

我有一个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\"}"

也许这就是你想要的:

repr(json.dumps(mydict))

也许这就是你想要的:

repr(json.dumps(mydict))

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()
,但是翻译表最多可以将一个字符映射为一个字符。

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()
,但是翻译表最多可以将一个字符映射为一个字符。

您最初的建议和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编码器在每个正斜杠前面加一个反斜杠。
如中所述。

您最初的建议和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编码器在每个正斜杠前面加一个反斜杠。
如中所述。

否,因为它不会转义双引号
字符。否,因为它不会转义双引号
字符。您不想用C定义词典。您想要一个语法为C的字符串,可以通过解析生成词典?为什么不把结果存储在一个文件中并在运行时加载这个文件来解决整个问题呢?那你就不必逃避了。我不是用C来解析它。它是一个嵌入式系统,我把字符串一字不差地传输到PC,然后在PC上解析字符串……事实上,它比这更好,它还适用于一个DWARF指令,它将字符串存储在一个符号文件中。我不能在运行时这样做;我的嵌入式系统无法访问任何文件系统。您不想用C定义字典。您想要一个语法为C的字符串,可以对其进行分析以生成字典?为什么不把结果存储在一个文件中并在运行时加载这个文件来解决整个问题呢?那你就不必逃避了。我不是用C来解析它。它是一个嵌入式系统,我把字符串一字不差地传输到PC,然后在PC上解析字符串……事实上,它比这更好,它还适用于一个DWARF指令,它将字符串存储在一个符号文件中。我不能在运行时这样做;我的嵌入式系统无法访问任何文件系统。有趣!那很聪明。我不再从事这个项目,也不再能够访问软件+测试用例,所以我不能轻易地尝试它。有趣!那很聪明。我不再从事这个项目,也不再能够访问软件+测试用例,所以我不能轻易地尝试它。