使用转义字符(如组分隔符)发送JSON

时间:2016-11-05 16:15:22

标签: c# json json.net escaping ascii

具体问题:如何在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”。如果你没有放入Regex.Unescape,它会输入“\\ u001”。我对编码和.json感到不稳定。有人能告诉我:

  1. 什么是“\ u001”。它是微软特有的吗?
  2. 收到此消息的人声称他们的服务器“阻塞”此消息。没有组分隔符时没问题。可以通过.json消息发送组分隔符吗?如果是这样怎么样?如果它可行,你会用C#技术解码它?
  3. 稍微多一点信息:服务器人员说\ u001在它们的末尾呈现为^](表示不可打印的字符)。我可以在发送消息之前删除\ u001,这可能不是一个坏主意。但是我发现还有其他不可打印的字符(例如CR,LF),保留该信息并通过.json发送它可能会很好。

    请原谅我的含糊不清。我仍然熟悉这个代码库和这些特殊的想法。我确实试图找出\ u001是什么但无济于事。我可以要求一个比“扼流圈”更好的解释,但是记住一些具体问题会很好。如果我能提供澄清或更多细节,请告诉我。

1 个答案:

答案 0 :(得分:1)

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

JSON中,字符串中的不可打印字符编码为\u +四个十六进制数字,其中数字是字符的Unicode(UTF-16)表示。在您的输出中,您可以看到发生的情况正是如此:您有\u001d,它是原始字节序列中的ASCII字符29。<​​/ p>

通常,为了避免创建和解码JSON的问题,您应该始终使用JSON序列化库,例如JSON.Net,它旨在为您处理所有这些。我猜你在你的问题中提到的“服务器伙伴”正试图手动解析JSON,这就是他们遇到麻烦的原因。如果您正确地执行所有操作,则根本不需要使用Regexes来操作JSON字符串,包括使用Regex.Unescape

这是一个简短的小提示:https://dotnetfiddle.net/Uy3PcM