Accesso alle proprietà con un punto nel loro nome

Sto cercando di deserializzare JSON. Il mio object radice ha una singola proprietà “en.pickthall”. Sto usando il tipo dinamico per leggere il mio JSON. Ho pensato che avrei potuto farla finita “.” nella proprietà poiché è un file JSON locale, ma in tal caso deve esserci un modo per accedere a tale proprietà

var result = App_Code.FileIOHelper.ReadFromDefaultFile("ms-appx:///Assets/en.pickthall.json"); dynamic stuff = JsonConvert.DeserializeObject(result); foreach(var x in stuff.(en.pickthall)) //Tried this intellisense didn't like it { } 

C # non ha modo di citare identificatori. Se non è un identificatore valido, la tua unica opzione è la riflessione.

Tuttavia, è ansible che l’object restituito dal deserializzatore JSON abbia modificato gli identificatori per renderli utilizzabili in C #: è ansible che si desideri enumerare tutte le proprietà per verificare se questo è il caso. Un object dinamico con indicizzatori potrebbe anche essere una soluzione (permettendo ad esempio stuff["en.pickthall"] ).

Un’altra alternativa è cambiare il modo in cui il serializzatore mappa le proprietà. Ad esempio, Newtonsoft.Jsoft consente di personalizzarlo utilizzando un IContractResolver . È abbastanza facile sostituire il . per qualcosa di più C # -sano in questo modo.

È ansible creare una class radice per deserializzare e utilizzare JsonProperty :

 public class Root { [JsonProperty(PropertyName = "en.pickthall")] public object EnPickthall { get; set; } public Root() {} public Root(en_pickthall) { this.EnPickthall = en_pickthall; } } 

Puoi quindi chiamare

 Root stuff = JsonConvert.DeserializeObject(result); foreach(var x in stuff.EnPickthall) { } 

È ansible serializzare non in dinamico ma in JObject e quindi accedere alla proprietà tramite

 JObject stuff = JsonConvert.DeserializeObject(Jsonstring); var x = stuff.Value("my.property") 

Con un object dinamico e NewtonSoft.Json:

 dynamic json = JValue.Parse(result); int Opens = Convert.ToInt32(json.opens); int Clicks = Convert.ToInt32(json.clicks); string State = json.state; 

So che hai detto che stavi usando un tipo dinamico per la deserializzazione JSON, ma volevo solo far notare che esiste un client .NET RESTful che supporta questo anche con le definizioni del modello statico. Per te o per chiunque altro accada su questa risposta quando cerchi una risposta ai loro problemi con i punti nei nomi delle proprietà nelle chiamate REST C #.

A partire dal nuovo RestSharp 106.1.0 (e intendo questa versione perché questo supporto è stato appena aggiunto), può gestire le proprietà di ridenominazione con un punto nel loro nome tramite l’attributo DeserializeAs. Un esempio è quando chiamo l’API ElasticSearch per una chiamata _cat con il seguente modello:

 public class CatResponse { public string index { get; set; } ... [DeserializeAs(Name = "docs.count")] public string docscount { get; set; } } 

E in realtà recupera la proprietà docs.count deserializzata in docscount ora:

  var resource = $"_cat/indices/{indexPattern}?format=json&pretty=true"; var request = new RestRequest(resource, Method.GET); var response = client.Execute>(request); 

Questo supporto è pronto all’uso e non è necessario utilizzare Newtonsoft.Json.JsonSerializer che ho anche sentito essere una ansible soluzione a questo problema ma che non sono riuscito a far funzionare.