首页 > 解决方案 > Streamreader 到 String 无法正常工作

问题描述

我正在获取以 Base64 编码的 HttpWebResponse 以下行从 API 获取 webresponse。

Dim myResp As HttpWebResponse = myReq.GetResponse()
Dim myreader As New System.IO.StreamReader(myResp.GetResponseStream)

我得到的响应类似于以下内容,但是实际响应太长,我无法在此处粘贴,因此我手动剥离了实际响应。

{"status":"1","data":"eyJiMmIiOlt7ImludiI6W3siaXRtcyI6W3sibnVtIjoxODAxLCJpdG1fZGV0Ijp7ImNzYW10IjowLCJzYW10Ijo4MDkuOTEsInJ0IjoxOCwidHh2YWwiOjg5OTksImNhbXQiOjgwOS45MX19XSwidmFsIjoxMDYxOC44MiwiaW52X3R5cCI6IlIiLCJwb3MiOiIyNCIsImlkdCI6IjExLTA3LTIwMTgiLCJyY2hyZyI6Ik4iLCJpbnVtIjoiUldHSjA3LzE4LzAwMDU4NCIsImNoa3N1bSI6IjVjMjNiY2M1ZTQ3ZDI0NjU5YWQzNTEzNTM1YjhiNTAzNmM4NGU0MzU5NWJiMTVjYzA4M2VkYzBiNTQzZTQ1MzcifSx7Iml0bXMiOlt7Im51bSI6MTgwMSwiaXRtX2RldCI6eyJjc2FtdCI6MCwic2FtdCI6NDE4LjUsInJ0IjoxOCwidHh2YWwiOjQ2NTAsImNhbXQiOjQxOC41fX1dLCJ2YWwiOjU0ODcsImludl90eXAiOiJSIiwicG9zIjoiMjQiLCJpZHQiOiIyNS0wNy0yMDE4IiwicmNocmciOiJOIiwiaW51bSI6IlJXR0owNy8xOC8wMDEyNjEiLCJjaGtzdW0iOiJjOGEyMjNmNmMzYjY5ODZiYzE2MmNjYjdmMDhlZTYxMTdjYTdkOWZhNmEzYTExMWY1MmVjNzllYmExMGM5MWQ3In1dLCJjZnMiOiJZIiwiY3RpbiI6IjI0QUFCQ1I3MTc2QzFaSiJ9LHsiaW52IjpbeyJpdG1zIjpbeyJudW0iOjEsIml0bV9kZXQiOnsiY3NhbXQiOjAsInNhbXQiOjMzNzUsInJ0IjoxOCwidHh2YWwiOjM3NTAwLCJjYW10IjozMzc1fX1dLCJ2YWwiOjQ0MjUwLCJpbnZfdHlwIjoiUiIsInBvcyI6IjI0IiwiaWR0IjoiMzEtMDctMjAxOCIsInJjaHJnIjoiTiIsImludW0iOiJULTAxNzcvMjAxOC0xOSIsImNoa3N1bSI6ImYzNzFmYjA0N2FjNTRlOTkwYzZjNzM5Zjk0NTgwMzZlMWQxNjE0N2IxYmQ0ZTkxY2FlNmEwN2IyOGVlYzE0YWUifV0sImNmcyI6IlkiLCJjdGluIjoiMjRBQURDSTIwMzJFMVo5In1dfQ=="}

我不确定为什么上面的 Base64 编码消息以{"status":"1","data":"开头,然后以"}结尾。

实际 Base64 数据在 {"status":"1","data":" 之后开始

由于流的开始和结束时那些不受支持的字符,我首先尝试将实际响应转换为字符串,如下所示。

Dim myResp As HttpWebResponse = myReq.GetResponse()
Dim myreader As New System.IO.StreamReader(myResp.GetResponseStream)

实际的流响应返回大约 248000 个字符(根据 POSTMAN 中收到的具有相同 API 的响应)。Debug 模式下的 Streamreader 信息也显示相同的 248000 数字。但是当我使用以下代码行将它们转换为字符串时,字符串会缩小到只有大约 32000 个字符。我不知道为什么会这样?

Dim myText As String = myreader.ReadToEnd

'''Then following code will remove all those unwanted characters from starting string, which are {"status":"1","data":" 
Dim Final_text As String = myText.Substring(myText.Substring(0, myText.LastIndexOf("""")).LastIndexOf("""") + 1)

'''Following code will remove two characters "} from end of the string.
Final_text = Final_text.Trim().Remove(Final_text.Length - 2)

''' Now Decode this proper Base64 String to JSON format
Dim data As Byte() = Convert.FromBase64String(Final_text)
Dim decodedString As String = Encoding.UTF8.GetString(data)

Dim JsonP As JObject = JObject.Parse(decodedString)       
Dim SetPointerOut As JToken = JsonP("b2b")

两件事:为什么从 Stream 转换为 String 会减少实际响应?大约 248000 份包机。32000 个字符。在调试模式下,如果我输入 ?mytext.length 它会返回 248000 作为值。但是当我将鼠标悬停并浏览 mytext 变量中的内容时,它只显示了大约 32000 个包机。

服务提供商说我从 API 获得的响应是​​ Base64 编码的,我必须在将其用作 JSON 之前对其进行解码。那么为什么我在流的开始(即使在邮递员中)得到不受支持的字符,它是以序列化方式的 Base64 编码消息吗?

我是否正在做正确的过程来首先将流转换为字符串,删除不需要的字符然后对其进行解码?或者还有其他方法。

标签: jsonvb.net

解决方案


好的,Visual Studio 调试模式下的 32768 字符问题是它自己。VS2015 存在不支持超过 32768 个字符的错误。阅读 为什么在 Visual Studio 2008 调试器中部分显示字符串?Visual Studio Text Visualizer 缺少文本

我用来从“mytext”字符串中删除多余字符的方法仍然有效并给出结果。但正如@Steve 在对该问题的评论中建议的那样,我应该解析 JSON 字符串。我发现这个想法更好更正确的方法。

所以最终代码如下:

Dim myResp As HttpWebResponse = myReq.GetResponse()
Dim myreader As New System.IO.StreamReader(myResp.GetResponseStream)
Dim myText As String = myreader.ReadToEnd
Dim json As String = myText
Dim jsonResult = JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(json)


Dim jsonObject As Newtonsoft.Json.Linq.JObject = Newtonsoft.Json.Linq.JObject.Parse(json)
Dim jsonValue As JValue = jsonObject("data")

Dim Final_text As String = jsonValue.ToString

''' No need of following code as doing JSON parse above
''' Dim Final_text As String = myText.Substring(myText.Substring(0, myText.LastIndexOf("""")).LastIndexOf("""") + 1)

'''Final_text = Final_text.Trim().Remove(Final_text.Length - 2)

Dim data As Byte() = Convert.FromBase64String(Final_text)
Dim decodedString As String = Encoding.UTF8.GetString(data)

Dim JsonP As JObject = JObject.Parse(decodedString)       
Dim SetPointerOut As JToken = JsonP("b2b")

推荐阅读