2016-11-05 504 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/)页面底部所示。 –

相关问题