Десериализуйте свойство JSON, начиная с @

#c# #json #.net #json-deserialization #datacontractserializer

Вопрос:

Я пишу консольное приложение на c#, где мне нужно получить дату JSON из webapi. По большей части это работает нормально, однако в одном из моих ответов JSON я получаю имя свойства, начинающееся с @. Кажется, я не могу понять, как поместить это свойство JSON в объект C#.

Мой код выглядит следующим образом:

 public class AlertResponse
{
    public string @class { get; set; }
    public string result { get; set; }
    public string info { get; set; }
}

public class AuthenticationResponse
{
    public string Access_token { get; set; }
}

class Test
{
    private static HttpClient client = new HttpClient();
    private static string BaseURL = "https://xxxxx.xxxx";

    public void Run()
    {
        client.BaseAddress = new Uri(BaseURL);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));

        AuthenticationResponse authenticationResponse = Login();

        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authenticationResponse.Access_token);

        AlertResponse OpenAlerts = GetOpenAlerts();
    }
    
    internal AlertResponse GetOpenAlerts()
    {
        var response = client.GetAsync("/api/v2/xxxxxxxxxxxxxxxxxx/alerts/open").Resu<

        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<AlertResponse>().Resu<
        }

        else
        {
            Console.WriteLine("{0} ({1})", (int)response.StatusCode, response.ReasonPhrase);
        }

        return null;
    }
    
    private AuthenticationResponse Login()
    {
        string apiKey = "gdfashsfgjhsgfj";
        string apiSecretKey = "sfhsfdjhssdjhsfhsfh";

        var byteArray = new UTF8Encoding().GetBytes("public-client:public");
        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
        var form = new FormUrlEncodedContent(new Dictionary<string, string> { { "username", apiKey }, { "password", apiSecretKey }, { "grant_type", "password" } });

        HttpResponseMessage tokenMessage = client.PostAsync("/auth/oauth/token", form).Resu<

        if (tokenMessage.IsSuccessStatusCode)
        {
            return tokenMessage.Content.ReadAsAsync<AuthenticationResponse>().Resu<
        }

        else
        {
            Console.WriteLine("{0} ({1})", (int)tokenMessage.StatusCode, tokenMessage.ReasonPhrase);
        }

        return null;
    }
}
 

И JSON, который я получаю, выглядит так:

 "AlertResponse": {
    "@class": "patch_ctx",
    "patchUid": "afdhgfhjdajafjajadfjadfjdj",
    "policyUid": "dsgafdhasfjafhdafhadfh",
    "result": "0x80240022",
    "info": "fdgdfhsfgjh"
}
 

Как я могу это исправить?

С наилучшими пожеланиями, Ледник

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

1. Вы пробовали десериализоваться в анонимный объект и посмотреть, как он анализируется внутри?

2. Примечание: public string @class { get; set; } по — прежнему называется свойством "class" , а не "@class" @ просто указывает компилятору игнорировать тот факт, что идентификатор является зарезервированным ключевым словом; вам нужно использовать атрибуты, согласно ответу Майкла, чтобы изменить имя сериализации

Ответ №1:

Вы используете Newtonsoft.Json или System.Text.Json?

В любом случае вы должны украсить свойство @class

 //System.Text.Json
[JsonPropertyName("@class")]
public string class { get; set; }
 

или

 //Newtonsoft.Json
[JsonProperty("@class")]
public string class { get; set; }
 

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

1. Afaik, когда я использую HttpResponseMessage. Содержание. ReadAsAsync<Объект>.результат im с помощью System.Text.Json. Однако, когда я пытаюсь украсить, украшение, кажется, игнорируется, я украшаю так: используя System.Text.Json. Сериализация; [JsonPropertyName(«@class»)] открытый строковый класс { get; set; }

2. Код, который я написал, должен работать. dotnetfiddle.net/eqNQuA Вы уверены, что у вас установлен правильный сериализатор json, совместимый с соответствующим атрибутом?

Ответ №2:

Я предполагаю, что вы ищете атрибут DataMemberAttribute и DataContract

 using System.Runtime.Serialization;

[DataContract]
public class AlertResponse
{
    [DataMember(Name = "@class")]
    public string Class { get; set; }
    [DataMember(Name = "result")]
    public string Result { get; set; }
    [DataMember(Name = "info")]
    public string Info { get; set; }
}
 

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

1. Как раз то, что я искал 🙂 Большое спасибо

2. @Glacierdk какой ответ сработал для вас? Вы приняли другой ответ и сказали спасибо за этот пост

3. Я нажал не на ту :S Я исправил ее 😀