解压缩C#WebResponse&去除它

时间:2016-10-19 05:51:51

标签: c# asp.net web-services rest deserialization

我正在与网络API讨论以获取

的响应数据

https://api.transport.nsw.gov.au/v1/gtfs/schedule/ferries

它基于protobuf架构

string authorization = "apikey *******************";

因此,如果您想尝试它,您可以创建一个免费的API密钥或使用我获得的SAMPLE压缩文件,并尝试使用C#解压缩或反序列化

示例代码位于:此link

我可以获得Web响应流,当我使用Postman并将其作为“压缩”文件下载时,当我解压缩文件时,我会获得大量具有我正在查找的数据的XML文件,但是当试图用代码这样做时,我总是得到错误,尝试了很多方法,其中一个是下面的

FeedMessage feed = DeserializeCompressed<FeedMessage>(webResponse.GetResponseStream());

 public static T DeserializeCompressed<T>(Stream stream, JsonSerializerSettings settings = null)
        {
            using (var compressor = new GZipStream(stream, CompressionMode.Decompress))
            using (var reader = new StreamReader(compressor))
            using (var jsonReader = new JsonTextReader(reader))
            {
                var serializer = JsonSerializer.CreateDefault(settings);
                return serializer.Deserialize<T>(jsonReader);
            }
        }

我想知道如何解压缩此zip文件流并将其反序列化为强类型C#类

2 个答案:

答案 0 :(得分:0)

几点

  • 您是否以压缩格式获取数据?我想没有。
  • 如果没有,那么,您为什么要尝试压缩和解压缩数据 在你的终端?这是业务要求吗?

BTW,您的代码需要一类Type T.

public static T DeserializeCompressed<T>(Stream stream, JsonSerializerSettings settings = null)
{
   using (var compressor = new GZipStream(stream, CompressionMode.Decompress))
   using (var reader = new StreamReader(compressor))
   using (var jsonReader = new JsonTextReader(reader))
   {
      var serializer = JsonSerializer.CreateDefault(settings);
       return serializer.Deserialize<T>(jsonReader);
   }
}

所以你的用法就是这样的 var obj = DeserializeCompressed(yourStream,jsonparam);

为了使上面的工作成为同样的课程。你的api url给了我这个输出。

{ "ErrorDetails":{ "TransactionId":"000001543eb7b14f-2fcea63", "ErrorDateTime":"2016-10-19T17:03:58.284+11:00", "Message":"The calling application is unauthenticated.", "RequestedUrl":"/v1/gtfs/schedule/ferries", "RequestMethod":"GET" } }

所以如果我想在我的应用程序中首先使用它,我将需要一个类。如下所示。您可以使用http://json2csharp.com/轻松生成它。

public class ErrorDetails
{
    public string TransactionId { get; set; }
    public string ErrorDateTime { get; set; }
    public string Message { get; set; }
    public string RequestedUrl { get; set; }
    public string RequestMethod { get; set; }
}

如果有任何帮助,请告诉我。我知道,这不是你需要的实际内容,但这将有助于你前进。

答案 1 :(得分:0)

我设法解决了这个问题 首先
下载
https://joshclose.github.io/CsvHelper/
 或使用NugGet Manager 安装

Install-Package CsvHelper

似乎解决方案是使用ZIPArchive类解压缩文件

using (ZipArchive archive = new ZipArchive(webResponse.GetResponseStream()))
                {
                    foreach (ZipArchiveEntry entry in archive.Entries)
                    {
                        Stream s = entry.Open();
                        var sr = new StreamReader(s);
                        var myStr = sr.ReadToEnd();
                    }
                }