Изучение С#. Я использую JSON.net для сериализации и десериализации ответа сервера.
У меня есть очень маленький кусок работы. Например, для OAuth2 мне нужно было отправить учетные данные, чтобы получить access_token
. Я должен был сделать это через следующее:
// Serialize the JSON response for the access_token
public class AccessToken
{
public string access_token { get; set; }
}
static async void GetCrmAccessToken(FormUrlEncodedContent content)
{
try
{
// Send the x-www-form-urlencoded info to the OAuth2 end point
HttpResponseMessage response = await Client.PostAsync("https://login.windows.net/42daf6bc-f7add741ac61/oauth2/token", content);
// Get the body from the response
var responseContent = await response.Content.ReadAsStringAsync();
// Extract out the access token from the repsonse
AccessToken responseBody = JsonConvert.DeserializeObject<AccessToken>(responseContent);
if (responseBody.access_token != "")
{
// If there is an access token, take it and use it in
// generating the query
RequestCrmQuery(responseBody.access_token);
}
else
{
Console.WriteLine("Could not get the access token.");
}
}
catch (Exception e)
{
Console.WriteLine(e);
throw;
}
}
В основном нужно было создать класс с общедоступной переменной для ключа, который я хотел получить из JSON.
Теперь, когда у меня есть токен доступа, ответ на запрос значительно больше.
[email protected]
. Не могу создать переменную с таким именем в С#. Как это будет работать, учитывая, что это один из важных ключей, с которыми мне нужно работать?Нужно ли создавать открытую переменную для каждого ключа, который я хочу работать с ответом JSON? (Есть десятки). Определите только вам нужно.
Может это меня сериализовать автоматически? Если так, то как? ДА. См. Реализацию в этом ответе: Вложенные списки и Automapper.Map
Некоторые из ключей в ответе сервера имеют сумасшедшие имена, такие как: [email protected]. Не могу создать переменную с таким именем в С#. Как это будет работать, учитывая, что это один из важных ключей, с которыми мне нужно работать?
Создайте свойства как это:
[SuppressMessage("ReSharper", "InconsistentNaming")]
[SerializePropertyNamesAsCamelCase]
public class SearchResult
{
[JsonProperty("title")]
public string Title { get; set; }
[JsonProperty("abstract")]
public string[] Abstract { get; set; }
[JsonProperty("dateIssued")]
public DateTime? DateIssued { get; set; }
[JsonProperty("@search.score")]
public decimal Score { get; set; }
[JsonProperty("@search.highlights")]
public Highlights Highlights { get; set; }
}
Могу ли я назвать переменную как-нибудь еще, но явно указать ключ в JSON, которому она соответствует? ДА. Смотрите выше реализацию
Существует три основных способа работы с JSON:
Используя json.net JObject, где вы можете получить свойства, используйте JPath для доступа к определенным узлам (аналогично XPath). Хорошей новостью является то, что вам не нужно создавать классы, но она работает немного медленнее, чем сериализация в объект.
Десериализация в.net объект. Вам нужно будет создать структуру для каждого необходимого свойства.
Десериализация в динамический объект \expando - это дает вам возможность работать с динамическим типом. Не нужно создавать классы.
Что касается ваших вопросов:
Ответил выше. Если вы используете десериализацию для объекта, вам нужно будет создать все свойства, к которым вы хотите получить доступ.
Есть некоторые клиенты, которые выполняют сериализацию за кулисами. Я предпочитаю использовать нативный клиент и делаю десериализацию самостоятельно. Вы всегда можете создать что-то на заказ довольно быстро.
Вы можете использовать [JsonProperty("<name of json property")]
над любым свойством.
[JsonProperty("realNodeName")] public string MyCoolProperty {get;set;}
То же, что (3).