2013-03-08 12 views
5

Nota: questa domanda è molto vicina a Embedding JSON objects in script tags, ma le risposte a tale domanda forniscono quello che già so (quello in JSON / == \/). Voglio sapere come farlo scappare.Come faccio a uscire dalla chiusura '/' nei tag HTML in JSON con Python?

La specifica HTML vieta i tag HTML chiusi ovunque all'interno di un elemento <script>. Quindi, questo fa sì che errori di analisi:

<script> 
var assets = [{ 
    "asset_created": null, 
    "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
    "body": "<script></script>" 
}]; 
</script> 

Nel mio caso, sto generando la situazione non valida per il rendering di una stringa JSON all'interno di un modello di Django, vale a dire:

<script> 
var assets = {{ json_string }}; 
</script> 

So che JSON analizza \/ lo stesso di /, quindi se riesco a sfuggire ai miei tag HTML di chiusura nella stringa JSON, starò bene. Ma non sono sicuro del modo migliore per farlo.

Il mio approccio ingenuo sarebbe solo questo:

json_string = '[{"asset_created": null, "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "<script></script>"}]' 
escaped_json_string = json_string.replace('</', r'<\/') 

C'è un modo migliore? O qualche trucco che sto trascurando?

risposta

6

risposta Aggiornato

Va bene ho pensato un paio di cose in modo non corretto. Per eseguire l'escape del JSON, la libreria simplejson ha un metodo JSONEncoderForHTML che può essere utilizzato. Potrebbe essere necessario installarlo tramite pip o easy_install se il codice non funziona. Poi si può fare qualcosa di simile:

import simplejson 
asset_json=simplejson.loads(json_string) 
encoded=simplejson.encoder.JSONEncoderForHTML().encode(assets_json) 

che encoded vi darà questa:

'{"asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", "body": "\\u003cscript\\u003e\\u003c/script\\u003e", "asset_created": null}' 

Si tratta di una soluzione più generale rispetto alla barra sostituirlo con cui gestisce gli altri avvertimenti di codifica pure.

La parte loads è un effetto collaterale di avere il JSON già codificato. Ciò può essere evitato non utilizzando Django, se possibile, per generare il JSON e invece di usare simplejson:

simplejson.dumps(your_object_to_encode, cls=simplejson.encoder.JSONEncoderForHTML) 

Vecchio risposta

Prova avvolgendo lo script in CDATA:

<script> 
//<![CDATA[ 
var assets = [{ 
    "asset_created": null, 
    "asset_id": "575155948f7d4c4ebccb02d4e8f84d2f", 
    "body": "<script></script>" 
}]; 
//]]> 
</script> 

E 'pensato per contrassegnare il parser su questo genere di cose. Altrimenti dovrai usare le fughe di caratteri che sono state menzionate.

+0

Ma questo funziona solo per XHTML, giusto? Con '' '', '' CDATA'' sembra non funzionare. Ecco perché ho preferito l'escape di '' \/'in JSON. La domanda era più su come eseguire la sostituzione della stringa per l'escape rispetto a come sfuggire al testo stesso. –

+0

@GeoffreyHing Ah sì ho assunto erroneamente la parte XHTML. Ho aggiornato la mia risposta per la parte di fuga di DJango. – cwgem

+1

@GeoffreyHing: django viene fornito con una propria copia di simplejson che è possibile importare usando 'from django.utils import simplejson' quindi non è necessario installarlo separatamente. –

Problemi correlati