Sono relativamente nuovo a lavorare con i dati C# e JSON e sto cercando indicazioni. Sto usando C# 3.0, con .NET3.5SP1 e JSON.NET 3.5r6.Deserializzazione dei dati JSON in C# utilizzando JSON.NET
Ho una classe C# definita che ho bisogno di compilare da una struttura JSON. Tuttavia, non tutte le strutture JSON per una voce recuperate dal servizio Web contengono tutti gli attributi possibili definiti nella classe C#.
Sto facendo quello che sembra essere il modo sbagliato, difficile e basta individuare ogni valore uno per uno dal JObject e trasformare la stringa nella proprietà di classe desiderata.
JsonSerializer serializer = new JsonSerializer();
var o = (JObject)serializer.Deserialize(myjsondata);
MyAccount.EmployeeID = (string)o["employeeid"][0];
Qual è il modo migliore per deserializzare una struttura JSON nella classe C# di spedizione possibili dati mancanti dalla fonte JSON?
La mia classe è definita come:
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; }
}
E un campione del JSON da analizzare è:
{
"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"
]
}
Grazie. Tuttavia, viene visualizzato l'errore "Impossibile deserializzare l'array JSON in tipo" System.String "." quando tenta di deserializzare (ad esempio) l'array givenname JSON nella stringa GivenName della classe. Gli attributi JSON che ho definito come stringa nella classe C# sono sempre solo array di elementi singoli. Questo è il motivo per cui ho iniziato a scegliere i valori uno per uno mentre mi sono imbattuto in questo tipo di problema durante il processo di deserializzazione. L'altra magia che sto trascurando? –
risposta aggiornato ... –
Quindi ... 'DateTime AccountStatusExpiration' (per esempio) non è annullabile come definito nel codice. Cosa ci vorrebbe per renderlo nullable? Basta cambiare 'DateTime' a' DateTime? '? –