Распаковка C # WebResponse и его десериализация

#c# #asp.net #web-services #rest #deserialization

#c# #asp.net #веб-сервисы #остальное #десериализация

Вопрос:

Я обращаюсь к веб-API, чтобы получить данные ответа для

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

он основан на схеме protobuf

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

Итак, если вы хотите попробовать, вы можете либо создать бесплатный ключ API, либо использовать полученный мной ОБРАЗЕЦ архивированного файла и попытаться распаковать или десериализовать его с помощью C#

Пример кода находится по этой ссылке

Я могу получить поток веб-ответов, и когда я делаю это с помощью 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 #

Комментарии:

1. Пожалуйста, обновите свой вопрос тем, что вы сделали. Это неполно.

2. Я не буду давать вам аутентификацию, действительно, вы можете попробовать создать ключ API бесплатно, или вы можете помочь мне рассказать, как распаковать / десериализовать веб-ответ, это так просто, это не имеет ничего общего с URL!!!

3. Пример заархивированного файла, получаемого из ответа, — можете ли вы распаковать его и десериализовать с помощью C #? mediafire.com/file/8fib27mg7b8fkda/response.zip

Ответ №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);

Для того, чтобы сделать вышеописанный класс для вас таким же. Ваш URL-адрес api выдал мне этот результат.

{ "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. если вы проверили отправленный URL-адрес, я пытаюсь использовать API, который возвращает веб-ответ, сжатый в ZIP-файле, и мне нужно распаковать, а затем обессолить его. то, что вы честно опубликовали, совершенно не связано с моим вопросом

2. @KarimKamel Указанный вами URL-адрес нуждается в аутентификации, и этот JSOn был его выводом. И решение — это просто способ сделать это. Вот и все. На самом деле ваш вопрос неполный. Вы только что показали нам метод, который вы используете для десериализации объекта, но не для его использования. Итак, основываясь на том, что у вас есть в вашем вопросе, это не имеет значения. Пожалуйста, сначала уточните свой вопрос о том, что вы делаете. Спасибо

3. Я не буду давать вам аутентификацию, действительно, вы можете попробовать создать ключ API бесплатно, или вы можете помочь мне рассказать, как распаковать / десериализовать веб-ответ, это так просто, это не имеет ничего общего с URL!!!

4. Пример заархивированного файла, получаемого из ответа, — можете ли вы распаковать его и десериализовать с помощью C #? mediafire.com/file/8fib27mg7b8fkda/response.zip

Ответ №2:

Мне удалось это решить
Первая
загрузка

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