2016-11-05 498 views
0

具體問題:在JSON中應該如何格式化字符,如組分隔符(0x1D)?發送帶轉義字符(如組分隔符)的JSON

詳情: 我繼承了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」。它是微軟具體的嗎?
  2. 收到此消息的人說他們的服務器「扼殺」了此消息。沒有組分隔符時沒有問題。是否可以通過.json消息發送組分隔符?如果是的話如何?如果它是可行的,你將如何用C#技術解碼它?

稍微更多信息:服務器人員說\ u001在他們的末尾表現爲^](它表示一個不可打印的字符)。我可以在發送消息之前剝去\ u001,這可能不是一個壞主意。但是在我看來,還有其他不可打印的字符(例如CR,LF),它可能很好地保存該信息並通過.json發送。

請原諒我的模糊性。我仍然熟悉這個代碼庫和這些特定的想法。我確實嘗試瞭解\ u001是什麼,但無濟於事。我可以要求比「窒息」更好的解釋,但是想一些具體的問題會很好。如果我可以提供澄清或更多的細節,請讓我知道。

+1

什麼是'rawData'?它是可以有任何值的任意字節序列嗎?或者他們實際上是ASCII字符值? – dbc

+0

據我所知,它們只是表示ascii字符值的字節。也就是說,我不相信0-127之外有任何我們需要處理的人物。我「清理」陣列大部分爲0(ascii 48)。 – Dave

回答

1

它不是Encording.ASCII.GetString即插入\u轉義序列;它是JSON序列化過程(你沒有在你的問題中顯示)正在做它,這是完全正常的和預期的。

JSON中,字符串中的不可打印字符編碼爲\u +四個十六進制數字,其中數字是字符的Unicode(UTF-16)表示。在您的輸出中,您可以看到發生的情況:您有\u001d,這是來自原始字節序列的ASCII字符29。

通常,爲了避免創建和解碼JSON時出現問題,您應該始終使用JSON序列化庫,如JSON.Net,該庫專爲處理所有問題而設計。我猜你在你的問題中提到的「服務器人」試圖手動解析JSON,這就是爲什麼他們遇到麻煩。如果你正確地做了一切,你根本不需要使用Regexes來操縱JSON字符串,包括使用Regex.Unescape

下面是一個簡短小提琴證明:https://dotnetfiddle.net/Uy3PcM

+0

感謝Brian的迴應。我認爲\ u001d在.json序列化之前就存在了,正如您從懸停在斷點處所看到的那樣。我同意,如果您將字符串寫入行,則不會顯示。也許有一個線索呢?無論如何,你給了我很多想法。是\ u001d一般(或特定於Microsoft)。如果一般,服務器人是否使用庫?我將在週一確認,但相信他們可能會使用Ruby on Rails。我假設有可用於處理\ u001d的Ruby的.json庫,但我不確定。 – Dave

+0

非常感謝您將我帶入dotnetfiddle。非常令人印象深刻。不幸的是,就我所知,你不能將鼠標懸停在斷點處的值(或者甚至有斷點?)。但是非常有用。 – Dave

+0

'\ u001d'與'0x1D'相同 - 它是用四個十六進制數字而不是兩個編碼的組分隔符字符。它根本不是「微軟具體」;它是[標準ASCII](http://www.asciitable.com/)編碼爲[標準JSON](http://www.json.org/)。如果他們遵循標準,所有值得使用的鹽JSON庫應該能夠處理'\ u'字符轉義符號,不管使用什麼語言。是的,有幾個JSON庫可用於Ruby,如[JSON.org](http://www.json.org/)頁面底部所示。 –

相關問題