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