2016-09-01 4 views
-1

Есть в любом случае сделать это в JavaScript:JSON.parse без побега

$ cat test.json 
{"body":"\u0000"} 

$ python3 -c 'import json; print(json.load(open("test.json", "r")))' 
{'body': '\x00'} 

Обратите внимание, что данные выше только один \ (не нужно экранировать). Таким образом, у вас есть следующая ситуация в JavaScript:

JSON.parse('{"body":"\\u0000"}') // works 
JSON.parse('{"body":"\u0000"}') // does not work 

С потенциально любые данные UTF-8 пришедшего из двоичного источника (WebSocket), может эти данные будут обрабатываться непосредственно, как в первом примере питона выше?

+0

В Javascript, как и в Python, '' \ '' имеет особое значение при определении строки. Вы должны удвоить его до '' \\ '' для удаления, чем для специального значения. * Результирующее строковое значение * действительно будет иметь только одну обратную косую черту, за которой следует символ 'u' и т. Д. –

+0

В файле' test.json' вы не определяете строковый литерал Python или Javascript, так что нет, обратная косая черта там. –

+1

В ECMAscript 6 есть синтаксис ['String.raw'] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/raw), который может дать вам то, что вы хотите: '' JSON.parse (String.raw' {"body": "\ u0000"} ')' ' –

ответ

0

Строка символов из \u0000 через \u001F рассматриваются как управляющие символы, и в соответствии с RFC-7159 не допускаются символы, используемые в JSON и должны быть экранированы, как указано in section 7.

То, что вы пытаетесь сделать, - это поставить необработанные управляющие символы в JSON, что явно неприемлемо, вы должны избежать его сначала, а не языки, принимающие его, даже Python.

Правильный ответ будет содержать кодированное значение UTF-8 в строке, содержащей формат JSON.

Это правильный JSON, и будет анализироваться с помощью любого JSON парсер на любом языке, даже в JavaScript:

{"body":"\u0000"} 

Это неправильно JSON (рассмотрим [NUL] в качестве контроля NUL характера, а она не может быть представлена ​​в тексте):

{"body":"[NUL]"} 

Вот почему JSON.parse('{"body":"\\u0000"}') работы и JSON.parse('{"body":"\u0000"}') нет.

Надеюсь, он уточнит, что не так с вашим тестом.

+0

Это не говорит OP, как указывать escape-последовательность '\ u0000' в строке JavaScript. –

+0

Извините, но вам нужно RTFM! –

+0

Я прочитал RFC просто отлично, спасибо. Вы зададите вопрос. –