【问题标题】:Uncompressing C# WebResponse & DeSerializing it解压缩 C# WebResponse 并对其进行反序列化
【发布时间】:2017-02-28 14:41:51
【问题描述】:

我正在与 Web API 交谈以获取

的响应数据

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

它基于 protobuf 架构

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

所以,如果您想尝试一下,您可以创建一个免费的 API 密钥或使用我获得的 SAMPLE 压缩文件,然后尝试使用 C# 对其进行解压缩或反序列化

示例代码位于:this link

我可以获取网络响应流,当我使用 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# 类

【问题讨论】:

  • 请用您所做的更新您的问题。这是不完整的。
  • 我确实不会给你认证,你可以尝试创建一个免费的 API 密钥,或者你可以帮助我说明如何解压缩/反序列化 Web 响应,就这么简单,它有与网址无关!!!
  • 从响应中获取的 ZIPPED 文件的示例是否可以使用 C# 对其进行解压缩和反序列化? mediafire.com/file/8fib27mg7b8fkda/response.zip

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


【解决方案1】:

几点

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

顺便说一句,你的代码需要一个类型 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; }
}

如果有帮助,请告诉我。我知道,这不是您真正需要的东西,但这会帮助您继续前进。

【讨论】:

  • 如果您检查了发布的 URL,我正在尝试使用一个 API,该 API 返回压缩在 ZIP 文件中的 Web 响应,我需要解压缩然后对其进行淡化。您诚实发布的内容与我的问题完全无关
  • @KarimKamel 您提供的 url 需要身份验证,而 JSOn 是相同的输出。解决方案只是这样做的一种方式。而已。其实你的问题是不完整的。您刚刚向我们展示了用于反序列化对象的方法,但没有展示其用法。因此,根据您的问题,这并非无关紧要。请先用你在做什么更新你的问题。谢谢
  • 我确实不会给你认证,你可以尝试创建一个免费的 API 密钥,或者你可以帮助我说明如何解压缩/反序列化 Web 响应,就这么简单,它有与网址无关!!!
  • 从响应中获取的 ZIPPED 文件的示例是否可以使用 C# 对其进行解压缩和反序列化? mediafire.com/file/8fib27mg7b8fkda/response.zip
【解决方案2】:

我已经设法解决了
首先
下载
https://joshclose.github.io/CsvHelper/
使用 NugGet 管理器安装

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();
                    }
                }

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 2017-10-30
    • 2012-08-18
    • 1970-01-01
    • 2015-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多