发送带有转义字符(如组分隔符)的JSON

本文关键字:分隔符 JSON 转义字符 | 更新日期: 2023-09-27 18:16:23

具体问题:如何在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: 000000000000000000000000000004'u001d1000000000000000",
    "Active": true,
    "Acknowledged": false,
    "Reported": false
  }
],

可以看到,Encoding.ASCII.GetString...处理ASCII字符29 (0x1d)的方式略有不同。它输入了一个"'u001"。如果你不输入正则表达式。Unescape输入"''u001"。我不太会编码和。json。谁能告诉我:

  1. 什么是"'u001"。这是微软特有的吗?
  2. 收到此消息的人表示他们的服务器在此消息上"阻塞"。没有组分隔符时没有问题。组分隔符可以通过。json消息发送吗?如果是,那又是怎么回事呢?如果它是可行的,你会如何用c#技术解码它?

更多信息:服务器人员说'u001在他们的终端上呈现为^](这表示不可打印的字符)。我可以在发送消息之前去掉'u001,这可能是个不错的主意。但我突然想到,还有其他不可打印的字符(CR, LF为例),它可能是很好的保留该信息,并通过。json发送。

请原谅我的含糊。我还在熟悉这个代码库和这些特殊的思想。我确实试图找出'u001是什么,但无济于事。我可以要求一个比"呛"更好的解释,但最好能在脑海中有一些具体的问题。如果我能提供澄清或更多细节,请告诉我。

发送带有转义字符(如组分隔符)的JSON

插入'u转义序列的不是Encording.ASCII.GetString;这是JSON序列化过程(你没有在你的问题中显示),这是完全正常和预期的。

在JSON中,字符串中不可打印的字符被编码为'u +四个十六进制数字,其中数字是字符的Unicode (UTF-16)表示形式。在您的输出中,您可以看到确实发生了什么:您有'u001d,它是原始字节序列中的ASCII字符29。

一般来说,为了避免创建和解码JSON的问题,您应该始终使用JSON之类的JSON序列化库。Net是专门为你处理这一切的。我猜您在问题中提到的"服务器人员"正在尝试手动解析JSON,这就是他们遇到麻烦的原因。如果你做的一切都是正确的,你应该不需要使用正则表达式来操作JSON字符串,包括使用Regex.Unescape

下面是一个简短的示例:https://dotnetfiddle.net/Uy3PcM