2016-11-05 13 views
0

特定の質問:JSONでグループセパレータ(0x1D)などの文字をどのようにフォーマットする必要がありますか?JSONをグループセパレータなどのエスケープ文字で送信する

詳細:(!ベースのC#またはWindows必ずしも)私は、いくつかのバーコードを読んでJSONメッセージでそれらを置くとサービスに彼らの方法でそれらを送信しているC#のコードベースを継承しました

コードは、次のようなバイト配列を取ります。

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"とは何ですか?それはマイクロソフト固有ですか?
  2. このメッセージを受信して​​いる人は、このメッセージでサーバが「チョーク」していることを示しています。グループセパレータがない場合は問題ありません。グループセパレータは.jsonメッセージで送信できますか?そしてもしそうなら、どのように?それが実行可能であれば、C#テクノロジでどのようにデコードしますか?

少し詳しい情報:サーバーの人は、\ u001は^](印刷できない文字を示します)のように表示されていると言います。私はメッセージを送信する前に\ u001を剥がすことができ、それは悪い考えではないかもしれません。しかし、その情報を保持して.json経由で送るのが良いかもしれない他の印刷不能な文字(CR、LFなど)があることが私にはあります。

私の曖昧さを許してください。私はまだこのコードベースとこれらの特定のアイデアに慣れています。私は何をしようとしましたが、\ u001は無駄です。私は "チョーク"よりも優れた説明を求めることができますが、いくつかの具体的な質問を念頭におくとよいでしょう。私が明確化または詳細を提供できる場合は、私に知らせてください。

+1

は何ですか?任意の値を持つことのできる任意のバイト列ですか?それとも、実際にはASCII文字の値ですか? – dbc

+0

私の知る限り、ASCII文字値のみを表すバイトです。つまり、0-127の範囲外の文字があるとは思わない。私は配列がほとんど0(ascii 48)を持つように "サニタイズ"しました。 – Dave

答えて

1

\uエスケープシーケンスを挿入しているのはEncording.ASCII.GetStringではありません。それはそれをやっているJSONのシリアル化プロセスです(これはあなたの質問には表示されていません)。これは完全に正常であり、期待されています。

JSONでは、文字列の印刷できない文字は、\u + 4桁の16進数でエンコードされます。数字は、文字のUnicode(UTF-16)表現です。あなたの出力では、正確に何が起こったのかを見ることができます:\u001d、元のバイトシーケンスからのASCII文字29です。

一般的に、JSONの作成とデコードに関する問題を避けるために、すべてのものを処理するように設計されたJSON.NetのようなJSON直列化ライブラリを常に使用する必要があります。私は、あなたがあなたの質問で言及した "サーバーの人々"がJSONを手動で解析しようとしていることを推測しているので、彼らは問題に遭遇しています。すべてを正しく実行している場合は、Regex.Unescapeを使用するなど、Regexesを使用してJSON文字列を操作する必要はありません。ここで

は実証する短いフィドルです: `rawData` https://dotnetfiddle.net/Uy3PcM

+0

応答Brianに感謝します。私は\ u001dが.jsonの直列化の前に存在していると思うので、ブレークポイントでホバリングすると分かります。文字列を行に書くと表示されないことに同意します。そしておそらくそこには手掛かりがありますか?いずれにせよ、あなたは私に多くのことを考えさせてくれました。 \ u001dは一般的(またはマイクロソフト固有)です。一般的な場合、サーバーのユーザーはライブラリを使用していますか?私は月曜日に確認しますが、Ruby on Railsを使用している可能性があります。 \ u001dを処理するRuby用の.jsonライブラリがあるとは思いますが、わかりません。 – Dave

+0

そして、私をdotnetfiddleに入れてくれてありがとう。非常に印象的。残念ながら、私が知る限り、ブレークポイント(またはブレークポイントを持っていてもかまいません)に値を置くことはできません。しかし、それほど有用ではありません。 – Dave

+0

'\ u001d'は' 0x1D'と同じです.2つではなく4つの16進数字でエンコードされたグループセパレータ文字です。 「マイクロソフト固有の」ものではありません。 [標準のJSON](http://www.json.org/)としてエンコードされた[標準ASCII](http://www.asciitable.com/)です。その塩の価値があるすべてのJSONライブラリは、標準に準拠している場合、どの言語に関係なく、 '\ u'文字エスケープ表記を処理できる必要があります。そして、はい、[JSON.org](http://www.json.org/)ページの下部にあるように、RubyにはいくつかのJSONライブラリが用意されています。 –

関連する問題