2016-11-05 5 views
0

Конкретный вопрос: Как следует форматировать символы, такие как разделитель групп (0x1D) в JSON?Отправка JSON с escape-символами, такими как разделители групп

Деталь: Я унаследовал C# кодового что читают некоторые штрих-коду, кладя их в сообщениях JSON и отправка их на своем пути к службе

(не обязательно C# или на основе Windows!) код принимает массив байтов, таких как:

byte[] rawData = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 
        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 29, 49, 
        48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48}; 

и использует такой код, чтобы перевести этот массив байтов в строку, которая кладется в .json:

string dataNew = Regex.Unescape(new string(Encoding.ASCII.GetString(rawData).ToCharArray())); 

Соответствующая часть .json тогда выглядит следующим образом:

"Notes": [ 
    { 
    "Id": 0, 
    "Details": "Produc code: CodeType: DataMatrix, Data: 000000000000000000000000000004\u001d1000000000000000", 
    "Active": true, 
    "Acknowledged": false, 
    "Reported": false 
    } 
], 

Как вы можете видеть, Encoding.ASCII.GetString... обрабатывают ASCII символ 29 (0x1D) немного по-другому. Он помещается в «\ u001». Если вы не добавили в Regex.Unescape, он помещается в «\\ u001». Я дрожа на кодировке и .json. Может ли кто-нибудь мне сказать:

  1. Что такое «\ u001». Является ли он специфичным для Microsoft?
  2. Люди, получающие это сообщение, заявляют, что их серверы «задыхаются» от этого сообщения. Нет проблем, если нет разделителя групп. Можно ли отправить разделитель групп через сообщения .json? И если да, то как? Если это выполнимо, как бы вы расшифровали его с помощью технологий C#?

Немного больше информации: Пользователи сервера говорят, что \ u001 отображается как ^] (что указывает на непечатаемый символ) на их конце. Я мог бы просто отключить \ u001 перед отправкой сообщения, и это может быть плохой идеей. Но мне кажется, что есть другие непечатаемые символы (например, CR, LF), где может быть полезно сохранить эту информацию и отправить ее через .json.

Прошу прощения за мою неопределенность. Я все еще знаком с этой базой кода и этими конкретными идеями. Я попытался выяснить, что делать, но безрезультатно. Я мог бы попросить лучшего объяснения, чем «задушить», но было бы неплохо иметь некоторые конкретные вопросы. Если я могу предоставить разъяснения или более подробную информацию, пожалуйста, дайте мне знать.

+1

Что такое 'rawData'? Это произвольная последовательность байтов, которая может иметь любые значения? Или они являются значениями символов ASCII? – dbc

+0

Насколько я знаю, это только байты, представляющие только символьные значения ascii. То есть, я не верю, что есть какие-либо символы за пределами 0-127, с которыми нам нужно иметь дело. Я «дезинфицировал» массив, чтобы иметь в основном 0s (ascii 48). – Dave

ответ

1

Это не Encording.ASCII.GetString, который вставляет escape-последовательность \u; это процесс сериализации JSON (который вы не указали в своем вопросе), который это делает, и это совершенно нормально и ожидается.

В JSON непечатные символы в строке кодируются как \u + четыре шестнадцатеричных цифры, где цифры представляют собой представление символа Unicode (UTF-16). На вашем выходе вы можете видеть, что это именно то, что произошло: у вас есть \u001d, который является символом ASCII 29 из исходной последовательности байтов.

Вообще, чтобы избежать проблем с созданием и расшифровкой JSON, вы всегда должны использовать библиотеку сериализации JSON, такую ​​как JSON.Net, которая предназначена для обработки всего, что для вас. Я предполагаю, что «серверные люди», о которых вы упоминаете в своем вопросе, пытаются разобрать JSON вручную, и именно поэтому у них возникают проблемы. Если вы все делаете правильно, вам не нужно использовать Regexes вообще для управления строкой JSON, включая использование Regex.Unescape.

Вот короткая скрипка, чтобы продемонстрировать: https://dotnetfiddle.net/Uy3PcM

+0

Спасибо за ответ Брайан. Я думаю, что \ u001d присутствует до сериализации .json, как вы можете видеть от зависания в точке останова. Я согласен, что это не отображается, если вы пишете строку в строке. И, возможно, в этом есть ключ? В любом случае, вы мне много о чем подумали. Является общим (или специфичным для Microsoft). Если вообще, ребята сервера используют библиотеку? Я подтвержу в понедельник, но верю, что они могут использовать Ruby on Rails. Я предполагаю, что для Ruby доступны библиотеки .json, которые обрабатывают \ u001d, но я не уверен. – Dave

+0

И большое спасибо за то, что поставили меня на dotnetfiddle. Очень впечатляюще. Насколько я могу сказать, вы не можете навешивать значения в точках останова (или даже иметь контрольные точки?). Но очень полезно, тем не менее. – Dave

+0

'\ u001d' - это то же самое, что и' 0x1D' - это символ группового разделителя, кодированный четырьмя шестнадцатеричными цифрами вместо двух. Это не «специфический для Microsoft»; это [стандарт ASCII] (http://www.asciitable.com/), закодированный как [стандартный JSON] (http://www.json.org/). Все библиотеки JSON, стоящие на их соли, должны иметь возможность обрабатывать символ «\ u' escape-символ, независимо от того, на каком языке, если они следуют стандарту. И да, для Ruby доступно несколько JSON-библиотек, как показано внизу страницы [JSON.org] (http://www.json.org/). –

Смежные вопросы