Я пишу обертку для статического API (Jenkins CI), и я пытаюсь упростить свою жизнь при работе с сериализованными объектами, получаемыми из.Net System.Net.WebResponse, путем записи функции в класс объекта для выполнения WebRequest и получить объект. Это работает нормально, пока я не хочу инициализировать экземпляр объекта в его конструкторе. Вот что я имею в виду:
[DataContract]
public class ApiData
{
public ApiData(string url)
{
// Assignment of object instance here
}
[DataMember]
public List<object> actions { get; set; }
[DataMember]
public string description { get; set; }
[DataMember]
public string displayName { get; set; }
...
[DataMember]
public List<object> upstreamProjects { get; set; }
public ApiData get_job_data(string url)
{
var request = WebRequest.Create(url);
var response = request.GetResponse();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ApiData));
return (ApiData)serializer.ReadObject(response.GetResponseStream());
}
}
Затем, когда я создаю экземпляр объекта, как показано ниже, у меня будет полностью инициализированный объект только в одной строке.
string job_url = "http://apihost.com/dir/job/api/json";
ApiData job_data = new ApiData(job_url);
Я знаю, что я могу просто назначить каждое свойство из возвращаемого сериализованного объекта каждому свойству экземпляра, но список свойств довольно длинный, и эта работа будет повторяться еще для нескольких классов. Это то, что я хочу сделать возможным? Я что-то пропустил?
Поэтому, подумав об этом, я в основном пытаюсь вернуть значение новому объекту с использованием конструктора объектов, что просто глупо. Я также пытался сохранить только одну строку за счет сокращения
ApiData job_data = new ApiData();
job_data = ApiData.get_job_data(job_url);
// get_job_data() only exists really to save time writing out the webrequest,
// so I included it as a class method
в
ApiData job_data = new ApiData(job_url);
Это тривиально. Когда я буду называть это, я, скорее всего, буду заботиться только о одном или двух значениях, поэтому я не буду экономить много времени. Это мой первый вопрос в StackOverflow, поэтому я постараюсь немного подумать, прежде чем спрашивать. Спасибо, Юваль Ицчаков, за ваш ответ.
Если я правильно понимаю, вам нужен общий метод десериализации. Вы можете написать Generic
метод с параметром T
который вы можете вызвать на всех объектах, которые вы хотите десериализовать.
Это может выглядеть так:
public static class RequestDeserializer
{
public static T SendRequestAndDeserialize<T>(string url) where T : new()
{
var request = WebRequest.Create(url);
var response = request.GetResponse();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T));
return (T)serializer.ReadObject(response.GetResponseStream());
}
}
и затем назовите его следующим образом:
var myDeserializedObject = RequestDeserializer.SendRequestAndDeserialize<ApiData>(url);
Конечно, этот пример не включает обработку Exception
которая должна быть принята во внимание, и, конечно же, архитектура вашей системы, это может быть более подходящим на уровне Data Access Layer
данным вашего кода.
Я бы предложил заглянуть в Json.NET, поскольку он значительно упрощает работу с данными JSON :)