具体问题:如何在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感到不稳定。有人能告诉我:
稍微多一点信息:服务器人员说\ u001在它们的末尾呈现为^](表示不可打印的字符)。我可以在发送消息之前删除\ u001,这可能不是一个坏主意。但是我发现还有其他不可打印的字符(例如CR,LF),保留该信息并通过.json发送它可能会很好。
请原谅我的含糊不清。我仍然熟悉这个代码库和这些特殊的想法。我确实试图找出\ u001是什么但无济于事。我可以要求一个比“扼流圈”更好的解释,但是记住一些具体问题会很好。如果我能提供澄清或更多细节,请告诉我。
答案 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