2016-04-12 21 views
4

C# dan REST son noktasına çağrı yapıyorum ve bir nesnesine serileştirilmiş olan json alıyorum. Bu nesnenin özelliklerinden biri dinamik bir özelliktir.JObject dinamik nesnesine dönüştürme

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

json serileştirme dinamik özelliğinin değeri aşağıdaki değer içeren bir JObject geçerli:: Dinamik özelliğinin değeri bu gibi sunucu sitesinde bir anonim nesne olarak ayarlanır

{{ 
    "id": "MyId2134", 
    "Name": "MyName" 
}} 
böyle özelliklere erişmek mümkün olması bekleniyor olurdu

:

var s = myObject.MyDynamicProp.Name; 

ama ben va almak zorunda Name özelliği yerine bulmazsa lue böyle:

var s = myObject.MyDynamicProp["Name"].Value; 
Böyle bir dinamik nesnesine JObject dönüştürerek çalıştı

ama döndürür JObject: Ben özelliklerini doğrudan çağırabilir öyle ki dinamik özellik değeri dönüştürebilir nasıl

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

?

var s = myObject.MyDynamicProp.Name; 

GÜNCELLEME ...

Bana şu hata veriyor aşağıdaki

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

ran:

{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] 

Bunun bir olduğunu eklemek istiyorum Xamarin iOS projesi ve kod bir PCL kütüphanesinde bulunur.

cevap

13

Bu aslında oldukça kolaydır.

dynamic do = myObject.MyDynamicProp; 

string name = do.Name; 

sizin fragmanı: From:

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

Console.WriteLine(name); // writes MyName 

bu işleri Neden: Bunun yerine JObject üzerinde var kullanımını dynamic kullanarak ve iyi olacak bir Richard açıkladığı gibi, JObjectIDynamicMetaObjectProvider uygulayan JToken dolaylı kaynaklanmaktadır. dynamic'un çalışmasına izin veren arayüzdür.

+4

bu çalışır neden: 'JObject' olan uygular [ 'IDynamicMetaObjectProvider'] (https://msdn.microsoft.com/en-us/library/System.Dynamic.IDynamicMetaObjectProvider.aspx) JToken'' dolaylı elde . Dinamik çalışmasına izin veren arayüz. – Richard

+0

Evet, gerçekten. Sağol Richard. Bunu cevabıma ekleyebilir miyim? –

+0

Bunu yapmaktan çekinmeyin. – Richard

İlgili konular