Mit Python ein C-String-Literal von JSON zu erzeugen

Ich habe ein Wörterbuch in Python, das ich gerne in JSON serialisieren und in eine richtige C-String umwandeln möchte, damit es einen gültigen JSON-String enthält, der meinem Eingabewörterbuch entspricht. Ich benutze das Ergebnis, um eine Zeile in einer C-Quelldatei zu autogenisieren. Ich habs? Hier ist ein Beispiel:

>>> 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"} 

Was ich generieren muss, ist die folgende C-String:

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

Mit anderen Worten, ich muss dem Backslash entkommen und doppelt zitieren auf das Ergebnis des Aufrufs von json.dumps (mydict). Zumindest glaube ich, dass ich das tun werde. Oder fehlt mir ein offensichtlicher Eckfall?

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

3 Solutions collect form web for “Mit Python ein C-String-Literal von JSON zu erzeugen”

AC-String beginnt mit einem Zitat und endet mit einem Zitat, hat keine eingebetteten Nullen, hat alle eingebetteten Zitate mit Backslash entkommen, und alle eingebetteten Backslash-Literale sind verdoppelt.

Also nimm deine Schnur, verdopple die Backslashs und entkomme den Zitaten mit einem Backslash. Ich denke, Ihr Code ist genau das, was Sie brauchen:

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

Alternativ können Sie für diese etwas weniger robuste Version gehen:

 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)) + '"' 

Ich würde gerne string.maketrans() aber eine Übersetzungstabelle kann ein Zeichen zu höchstens einem einzelnen Zeichen abbilden.

Ihr ursprünglicher Vorschlag und die Antwort von hughdbrown sieht mir richtig aus, aber ich habe eine etwas kürzere Antwort gefunden:

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

Testschrift:

 >>> 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\"}" 

Die genau wie die richtige C-String aussieht.

(Glücklicherweise Python's "json.dumps ()" passiert Vorwärts-Schrägstriche gerade durch ohne Veränderung – im Gegensatz zu einigen JSON-Encodern, die Präfix jeder Vorwärts-Schrägstrich mit einem Backslash. So wie die bei der Verarbeitung entgangene URL-Saiten innerhalb von json mit Python ).

Vielleicht ist das, was du willst

 repr(json.dumps(mydict)) 
  • Kann nicht raw_input erhalten, um eine Zahl zurückzugeben
  • Entfernen Sie das erste Zeichen eines Strings
  • Java: String-Formatierung mit Platzhaltern
  • Konvertieren Sie einen String in Ganzzahl mit Dezimal in Python
  • Skript zum Umwandeln von ASCII-Zeichen in "<Uxxx>" Unicode-Notation
  • Unicode re.sub () funktioniert nicht mit \ g <0> (Gruppe 0)
  • Casting float ohne wissenschaftliche Notation
  • Sind Strings in Python gepoolt
  • Wie man einen String auf Whitespace aufteilt und Offsets und Längen von Wörtern behält
  • Python: die meisten idiomatischen Weg, um keine zu leeren String zu konvertieren?
  • Finde Start- und Endpositionen aller Vorkommnisse innerhalb eines Strings in Python
  • Python ist die beste Programmiersprache der Welt.