以@开头反序列化JSON属性

Deserialize JSON property starting with @

我正在编写一个 c# 控制台应用程序,我需要从 webapi 获取一些 JSON 日期。 在大多数情况下,这工作正常,但是在我的 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").Result;

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

        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).Result;

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

        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"
}

我该如何解决这个问题?

此致 冰川

您使用的是 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; }

我猜你正在寻找 DataMemberAttribute and 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; }
}