#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 Я исправил ее 😀