Автоматическая сериализация ответа сервера JSON с JSON.net

2

Изучение С#. Я использую 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.

Теперь, когда у меня есть токен доступа, ответ на запрос значительно больше.

  1. Нужно ли создавать открытую переменную для каждого ключа, который я хочу работать с ответом JSON? (Есть десятки).
  2. Может ли это быть сериализовано автоматически? Если так, то как?
  3. Некоторые из ключей в ответе сервера имеют сумасшедшие имена, такие как: [email protected]. Не могу создать переменную с таким именем в С#. Как это будет работать, учитывая, что это один из важных ключей, с которыми мне нужно работать?
  4. Могу ли я назвать переменную как-нибудь еще, но явно указать ключ в JSON, которому она соответствует?
  • 0
    "создать метод для каждого ключа" ??? Убедитесь, что ваша основная учетная запись искала для автоматического создания классов из JSON.
  • 0
    Да, не следуя тому, что вы говорите.
Показать ещё 1 комментарий
Теги:
json.net

2 ответа

1

Нужно ли создавать открытую переменную для каждого ключа, который я хочу работать с ответом 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, которому она соответствует? ДА. Смотрите выше реализацию

1

Существует три основных способа работы с JSON:

  1. Используя json.net JObject, где вы можете получить свойства, используйте JPath для доступа к определенным узлам (аналогично XPath). Хорошей новостью является то, что вам не нужно создавать классы, но она работает немного медленнее, чем сериализация в объект.

  2. Десериализация в.net объект. Вам нужно будет создать структуру для каждого необходимого свойства.

  3. Десериализация в динамический объект \expando - это дает вам возможность работать с динамическим типом. Не нужно создавать классы.

Что касается ваших вопросов:

  1. Ответил выше. Если вы используете десериализацию для объекта, вам нужно будет создать все свойства, к которым вы хотите получить доступ.

  2. Есть некоторые клиенты, которые выполняют сериализацию за кулисами. Я предпочитаю использовать нативный клиент и делаю десериализацию самостоятельно. Вы всегда можете создать что-то на заказ довольно быстро.

  3. Вы можете использовать [JsonProperty("<name of json property")] над любым свойством.

    [JsonProperty("realNodeName")] public string MyCoolProperty {get;set;}

  4. То же, что (3).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню