【问题标题】:Getting JSON data from a response stream and reading it as a string?从响应流中获取 JSON 数据并将其作为字符串读取?
【发布时间】:2013-12-07 03:40:43
【问题描述】:

我正在尝试从我发送 POST 请求时收到的服务器读取响应。查看提琴手,它说这是一个 JSON 响应。如何使用 C# Winforms 将其解码为普通字符串,最好不要使用外部 API。如果您需要,我可以提供额外的代码/提琴手结果。

提琴手和胡言乱语的图像:

乱码来自我尝试读取以下代码中的流:

Stream sw = requirejs.GetRequestStream(); 
sw.Write(logBytes, 0, logBytes.Length); 
sw.Close(); 
response = (HttpWebResponse)requirejs.GetResponse();
Stream stream = response.GetResponseStream(); 
StreamReader sr = new StreamReader(stream); 
MessageBox.Show(sr.ReadToEnd());

【问题讨论】:

  • “最好没有外部 API。”使用外部 API,例如 Newtonsoft.Json(也称为 JSON.NET)。
  • 您需要将其作为字符串进行显示,还是需要利用其中包含的数据(意味着您需要将其作为数组/列表提供)?
  • @SteveWellens - OP 希望将响应作为字符串读取,这确实不需要外部 API。解析可能需要 JSON.Net... 代码看起来很合理。显然缺少创建,OP 可能需要阅读有关encodings 的信息,这很可能是输出的原因。
  • @AlexeiLevenkov - 感谢您重申 OP 的愿望。我认为他会发现尝试从 JSON 字符串创建对象需要大量工作,而使用 3rd 方库是一种可接受的方式。我正在向他可能会去的方向轻推他。
  • @r3mus 我需要它作为字符串,然后我可以将它作为标题发送

标签: c# json winforms httpwebresponse


【解决方案1】:

正如 cmets 中提到的,Newtonsoft.Json 确实是一个很好的库,值得使用——非常轻量级。

如果您真的只想使用 Microsoft 的 .NET 库,还可以考虑 System.Web.Script.Serialization.JavaScriptSerializer。

var serializer = new System.Web.Script.Serialization.JavaScriptSerializer();
var jsonObject = serializer.DeserializeObject(sr.ReadToEnd());

【讨论】:

  • 谢谢! HTTPS 连接中的 HTTPWebRequest 是否会阻止它被反序列化?因为登录是HTTPS连接,而且我知道JSON是有效的,但是当我尝试反序列化它时,它没有成功,说“无效的JSON Primitive”。我在这里错过了什么吗?
  • 我从来没有遇到过解码来自 HTTPS 连接的响应的问题。解码失败的原始文本是什么?
【解决方案2】:

假设(您还没有澄清)您需要实际解码流,因为 A)检索远程文本流有据可查,而 B)您不能对未解码的 JSON 流进行任何操作。

您最好的做法是实施System.Web.Helpers.Json

using System.Web.Helpers.Json
...
var jsonObj = Json.Decode(jsonStream);

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-21
  • 2013-11-02
相关资源
最近更新 更多