我正在与网络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#类
答案 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();
}
}