Я относительно новичок в работе с данными C# и JSON и ищу руководство. Я использую C# 3.0, с .NET3.5SP1 и JSON.NET 3.5r6.Десалиализация данных JSON на C# с использованием JSON.NET
У меня есть определенный класс C#, который мне нужно заполнить из структуры JSON. Однако не каждая структура JSON для записи, полученной из веб-службы, содержит все возможные атрибуты, которые определены в классе C#.
Я делаю то, что кажется неправильным, трудным и просто выбирает каждое значение по одному из объекта JObject и преобразует строку в требуемое свойство класса.
JsonSerializer serializer = new JsonSerializer();
var o = (JObject)serializer.Deserialize(myjsondata);
MyAccount.EmployeeID = (string)o["employeeid"][0];
Каков наилучший способ десериализации структуру JSON в класс C# и обработки возможных недостающих данных из источника JSON?
Мой класс определяется как:
public class MyAccount
{
[JsonProperty(PropertyName = "username")]
public string UserID { get; set; }
[JsonProperty(PropertyName = "givenname")]
public string GivenName { get; set; }
[JsonProperty(PropertyName = "sn")]
public string Surname { get; set; }
[JsonProperty(PropertyName = "passwordexpired")]
public DateTime PasswordExpire { get; set; }
[JsonProperty(PropertyName = "primaryaffiliation")]
public string PrimaryAffiliation { get; set; }
[JsonProperty(PropertyName = "affiliation")]
public string[] Affiliation { get; set; }
[JsonProperty(PropertyName = "affiliationstatus")]
public string AffiliationStatus { get; set; }
[JsonProperty(PropertyName = "affiliationmodifytimestamp")]
public DateTime AffiliationLastModified { get; set; }
[JsonProperty(PropertyName = "employeeid")]
public string EmployeeID { get; set; }
[JsonProperty(PropertyName = "accountstatus")]
public string AccountStatus { get; set; }
[JsonProperty(PropertyName = "accountstatusexpiration")]
public DateTime AccountStatusExpiration { get; set; }
[JsonProperty(PropertyName = "accountstatusexpmaxdate")]
public DateTime AccountStatusExpirationMaxDate { get; set; }
[JsonProperty(PropertyName = "accountstatusmodifytimestamp")]
public DateTime AccountStatusModified { get; set; }
[JsonProperty(PropertyName = "accountstatusexpnotice")]
public string AccountStatusExpNotice { get; set; }
[JsonProperty(PropertyName = "accountstatusmodifiedby")]
public Dictionary<DateTime, string> AccountStatusModifiedBy { get; set; }
[JsonProperty(PropertyName = "entrycreatedate")]
public DateTime EntryCreatedate { get; set; }
[JsonProperty(PropertyName = "entrydeactivationdate")]
public DateTime EntryDeactivationDate { get; set; }
}
И образец JSON для синтаксического анализа является:
{
"givenname": [
"Robert"
],
"passwordexpired": "20091031041550Z",
"accountstatus": [
"active"
],
"accountstatusexpiration": [
"20100612000000Z"
],
"accountstatusexpmaxdate": [
"20110410000000Z"
],
"accountstatusmodifiedby": {
"20100214173242Z": "tdecker",
"20100304003242Z": "jsmith",
"20100324103242Z": "jsmith",
"20100325000005Z": "rjones",
"20100326210634Z": "jsmith",
"20100326211130Z": "jsmith"
},
"accountstatusmodifytimestamp": [
"20100312001213Z"
],
"affiliation": [
"Employee",
"Contractor",
"Staff"
],
"affiliationmodifytimestamp": [
"20100312001213Z"
],
"affiliationstatus": [
"detached"
],
"entrycreatedate": [
"20000922072747Z"
],
"username": [
"rjohnson"
],
"primaryaffiliation": [
"Staff"
],
"employeeid": [
"999777666"
],
"sn": [
"Johnson"
]
}
Спасибо. Однако я получаю сообщение об ошибке «Невозможно десериализовать массив JSON в тип« System.String ». когда он пытается десериализовать (например) массив заданного имени JSON в строку класса NameName. Атрибуты JSON, которые я определил как строку в классе C#, представляют собой только массивы одиночных элементов. Вот почему я начал собирать ценности один за другим, когда я столкнулся с проблемой такого рода во время процесса десериализации. Другая магия, которую я пропускаю? – 2010-03-30 15:18:42
обновленный ответ ... –
Итак ... 'DateTime AccountStatusExpiration' (например) не имеет значения NULL, как определено в коде. Что нужно сделать, чтобы сделать его недействительным? Просто измените 'DateTime' на' DateTime? '? –