.net C#中UTF8到ASCII的转换

js5cn81o  于 2022-12-27  发布在  .NET
关注(0)|答案(2)|浏览(326)

我知道已经有一个非常类似的问题here,但不幸的是,顶部的答案没有帮助我。
我想通过Unity Webrequest将一些数据POST到一个RESTful Web服务。
postData中的数据将被转义,然后通过System.Text.Encoding.UTF8解释为字节流。
postData中的数据以JSON格式存储。远程Web服务将使用NewtonSoft.Json对所有传入数据进行反序列化。
不幸的是,远程Web服务抛出一个JsonReaderException,消息为"Unexpected character encountered while parsing value: %. Path '', line 0, position 0."这是因为发送的数据看起来像这样的字符串(截断):
%7b%22日志类型%22%3a%22钻取%22%2c%22操作%22%3a%22已启动%22%2c%22描述%22%3a%22...
在调用Newtonsoft.Json库进行反序列化之前,我尝试将传入数据从UTF-8转换为ASCII:

byte[] contentBytes = await Request.Content.ReadAsByteArrayAsync();
string postContents = Encoding.ASCII.GetString(Encoding.Convert(Encoding.UTF8, Encoding.ASCII, contentBytes));

但是,JsonReaderException仍然被抛出,因为postContents看起来仍然是这样的:
%7b%22日志类型%22%3a%22钻取%22%2c%22操作%22%3a%22已启动%22%2c%22描述%22%3a%22...
我应该做些什么来确保远程Web服务可以成功地反序列化它接收到的数据?

flvtvl50

flvtvl501#

你收到的数据是URL encoded
例如:

  • %22"
  • %3a:

因此,接收到的URL编码字符串的开头是:
{"LogType":"Drill"
这显然是有效的JSON字符串。
因此,您需要做的是将其url decode为常规JSON字符串,然后使用JSON.NET对其进行反序列化。

dxxyhpgq

dxxyhpgq2#

//url decode to byte[]
    byte[] bytes = HttpUtility.UrlDecodeToBytes(urlstring);
    //byte[] to jsonstring
    string json = Encoding.UTF8.GetString(bytes);

classname decoded = JsonConvert.DeserializeObject<classname>(json);

相关问题