C#反序列化JSON API的HttpWebResponse时遇序列化异常
问题分析与解决方案
嘿,Milo,我一眼就揪出问题所在啦!你虽然拿到了201的成功状态码,但你错误地用JSON序列化器去解析了非JSON格式的响应内容——API返回的是Base64编码的PDF文档,不是你预期的JSON数据,这才导致了那个“Unexpected char '.'”的序列化异常。
具体原因
你用Mozilla REST客户端测试时能看到正确响应,是因为客户端能识别出这是Base64编码的PDF并正确处理,但你的代码里却用DataContractJsonSerializer尝试反序列化,而这个序列化器只能处理JSON结构的数据,遇到PDF Base64里的特殊字符(比如点号)自然就报错了。
解决步骤
先确认响应类型:你可以先打印下响应的Content-Type,验证这个判断:
Console.WriteLine(httpResponse.ContentType);输出应该是类似
application/pdf或者text/plain(如果API用Base64明文返回的话),绝对不是application/json。修改响应读取逻辑:既然返回的是Base64编码的PDF,那我们直接解码保存成文件即可,不需要用到你的
GLSParcelClass(这个类是用来接收JSON格式响应的,这次用不上)。修改后的读取代码如下:HttpWebResponse httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); using (StreamReader loStream = new StreamReader(httpResponse.GetResponseStream())) { // 读取Base64格式的PDF字符串 string base64PdfContent = loStream.ReadToEnd(); try { // 将Base64解码为字节数组 byte[] pdfBytes = Convert.FromBase64String(base64PdfContent); // 保存为本地PDF文件 File.WriteAllBytes("GLS_Shipping_Label.pdf", pdfBytes); Console.WriteLine("PDF标签已成功保存!"); } catch (FormatException ex) { // 处理Base64解码失败的情况 Console.WriteLine("Base64解码出错:" + ex.Message); } }额外提示:建议你再仔细看下GLS API的文档,确认哪些接口返回JSON,哪些返回PDF文件。如果后续有接口确实返回JSON数据,那你的
GLSParcelClass和DataContractJsonSerializer的用法是没问题的,但这次的场景显然不属于这种情况。
内容的提问来源于stack exchange,提问作者Milo
相关产品推荐
相关产品推荐

