具体问题:如何在JSON中格式化组分隔符(0x1D)等字符?
细节:我继承了一个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: 000000000000000000000000000004u001d1000000000000000",
"Active": true,
"Acknowledged": false,
"Reported": false
}
],
可以看到,Encoding.ASCII.GetString...
处理ASCII字符29 (0x1d)的方式略有不同。它输入了一个"u001"。如果你不输入正则表达式。Unescape输入"\u001"。我不太会编码和。json。谁能告诉我:
- 什么是"u001"。这是微软特有的吗?
- 收到此消息的人表示他们的服务器在此消息上"阻塞"。没有组分隔符时没有问题。组分隔符可以通过。json消息发送吗?如果是,那又是怎么回事呢?如果它是可行的,你会如何用c#技术解码它?
更多信息:服务器人员说u001在他们的终端上呈现为^](这表示不可打印的字符)。我可以在发送消息之前去掉u001,这可能是个不错的主意。但我突然想到,还有其他不可打印的字符(CR, LF为例),它可能是很好的保留该信息,并通过。json发送。
请原谅我的含糊。我还在熟悉这个代码库和这些特殊的思想。我确实试图找出u001是什么,但无济于事。我可以要求一个比"呛"更好的解释,但最好能在脑海中有一些具体的问题。如果我能提供澄清或更多细节,请告诉我。插入u
转义序列的不是Encording.ASCII.GetString
;这是JSON序列化过程(你没有在你的问题中显示),这是完全正常和预期的。
在JSON中,字符串中不可打印的字符被编码为u
+四个十六进制数字,其中数字是字符的Unicode (UTF-16)表示形式。在您的输出中,您可以看到确实发生了什么:您有u001d
,它是原始字节序列中的ASCII字符29。
一般来说,为了避免创建和解码JSON的问题,您应该始终使用JSON之类的JSON序列化库。Net是专门为你处理这一切的。我猜您在问题中提到的"服务器人员"正在尝试手动解析JSON,这就是他们遇到麻烦的原因。如果你做的一切都是正确的,你应该不需要使用正则表达式来操作JSON字符串,包括使用Regex.Unescape
。