json - 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 编码消息吗?
我是否正在做正确的过程来首先将流转换为字符串,删除不需要的字符然后对其进行解码?或者还有其他方法。
解决方案
好的,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")
推荐阅读
- python - 在python中多次替换字符串的一部分,但每次替换都会将字符串中的数字增加1
- css - 实现 css btn 类不应用自定义字体
- android - 为什么导航控制器不能声明为类变量?
- android - 如何修复 values.xml:227: 错误:
- 内部元素必须是资源引用或为空
- c# - 使用反射/堆栈跟踪(或其他)获取属性名称?
- python-3.x - 如何在 Tensorflow 2.0 中使用嵌入投影仪
- c# - 对话框中 CalendarDatePicker 的阴影
- java - 关于连接到 oracle 数据库的问题。在哪种情况下必须使用隧道?
- sql - 放置在括号内与单独放置在条件语句中的 AND 和 OR 组合之间的区别
- java - 如何将数据从适配器内的 onBindViewHolder 传递到选项卡