La conversione di JObject di un oggetto dinamico

Sto chiamando un endpoint REST da C# e sto ricevendo json che viene serializzato in un oggetto. Una delle proprietà di questo oggetto, è una proprietà dinamica. Il valore della proprietà dinamica è impostato come un oggetto anonimo sul server del sito come questo:

myObject.MyDynamicProp = new { Id = "MyId2134", Name = "MyName" };

Sul sito client il valore della proprietà dinamica dalla serializzazione json è un JObject contenente il seguente valore:

{{
  "id": "MyId2134",
  "Name": "MyName"
}}

Mi sarei aspettato di essere in grado di accedere alla proprietà come questo:

var s = myObject.MyDynamicProp.Name;

ma non la proprietà Name invece devo ottenere il valore come questo:

var s = myObject.MyDynamicProp["Name"].Value;

Ho provato a convertire il JObject in un oggetto dinamico come questo, ma restituisce JObject:

var dyn = myObject.MyDynamicProp.ToObject<dynamic>();

Come posso convertire la dinamica del valore della proprietà tali che io possa chiamare le sue proprietà direttamente?

var s = myObject.MyDynamicProp.Name;

AGGIORNAMENTO …

Ho eseguito i seguenti

 dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\", \"Name\": \"MyName\"}}");
 string name = d.MyDynamicProp.Name;

Che mi da il seguente errore:

 {Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:    `Newtonsoft.Json.Linq.JObject' does not contain a definition for `MyDynamicProp'
  at Microsoft.Scripting.Interpreter.ThrowInstruction.Run (Microsoft.Scripting.Interpreter.InterpretedFrame frame) [0x00027]

Vorrei aggiungere che questo è un Xamarin iOS progetto e il codice è situato in una PCL biblioteca.


Ho pensato che ci fosse un problema con il mio codice, ma sembra che non è possibile utilizzare tipi dinamici all’interno di un iOS con Xamarin progetto.
https://developer.xamarin.com/guides/ios/advanced_topics/limitations/

OriginaleL’autore doorman | 2016-04-12

One Reply
  1. 15

    In realtà è abbastanza facile. Invece di utilizzare var utilizzare dynamic sul tuo JObject e sarete bene:

    dynamic do = myObject.MyDynamicProp;
    
    string name = do.Name;

    Dal frammento:

    dynamic d = JsonConvert.DeserializeObject("{\"MyDynamicProp\": {\"id\": \"MyId2134\", \"Name\": \"MyName\"}}");
    string name = d.MyDynamicProp.Name;
    
    Console.WriteLine(name); //writes MyName

    Perché funziona: Come Richard spiegato, JObject deriva indirettamente dal JToken che implementa IDynamicMetaObjectProvider. È l’interfaccia che permette dynamic di lavoro.

    Perché funziona: JObject deriva indirettamente dal JToken che implementa IDynamicMetaObjectProvider. È l’interfaccia che permette dynamic di lavoro.
    Sì, infatti. Grazie Riccardo. Posso aggiungere che la mia risposta?
    Sentitevi liberi di farlo.
    Grazie per la risposta veloce, ma anche se io la uso dinamico invece di var I get “Unknown membro: Nome di” quando l’ho chiamata la proprietà.
    È Name, non name.

    OriginaleL’autore Patrick Hofman

Lascia un commento