2015-08-07 21 views
5

Aynı sınıfta olması gereken ("JSON/XML/neyse") "anonim" nesnelerin sonsuz akışını aldığımı varsayın, ancak tüm nesneler tüm alanları/özellikleri içermez. örn: kayıp bir özellik gidebileceğimi sınırlı nesnelerin durumunda, orada olarak eşleşen, diğeri sığmaz şablon olarak nesnelerin birini kullanın ve bir sınıf oluşturmak eğer Gördüğünüz gibiC# Sınıfı çalışma zamanında oluşturun ve değiştirin

{ 
object1 : {field1 : 1, field2: 2}, 
object2 : {field1 : 3, field4: 5} 
} 

Onları ve tüm alanları ayıklayın, sonra herkese uyan ve her nesne için eksik özellikleri varsayılan bir sınıf oluşturun.

Ancak "sonsuz" bir akışta bunu yapmak mümkün değildir, bu yüzden bulduğum tek yaklaşım, eklediğim fazladan bir özellik varsa, sonraki nesneyi ilk nesneyle eşleşen ve ilk nesneyi oluşturan Class1'i oluşturmaktır. Class1'e ve Class1'in ikinci nesnesini yaratın, sonra her nesne için tekrar gidin. Class1'i düzenlerken, düzenlemeden önce yapılmış olan tüm nesneler, yeniden oluşturmaya gerek kalmadan yeni özelliği içermelidir.

Bunun nasıl yapılacağı hakkında bir fikriniz var mı?

Not: Yeni bir alan bulduğum her defasında yeni bir sınıf oluşturmak istemiyorum, bu eski nesnelerin yeniden oluşturulması için çok fazla zaman harcanmasına gerek kalmaz.

+11

Neden, hiç beton sınıfları gereken bir sözlük ya da expandoobject falan gibi olmaz bir şey daha dinamik uyum ihtiyaçlarınız daha iyi, değil mi? –

+4

Herhangi bir dersi beyan etmeyin. JObject.Parse ("...") '(Json.Net'te) kullanın. Artık nesnenin içindeki tüm özelliklerle var. – Eser

+0

'allProperties.Add ("field1", 1) gibi özelliklerinizi depolamak için 'Dictionary allProperties' öğesini kullanırsanız; allProperties.Add ("field4", 5); '? – Fabjan

cevap

1

Json.Net kütüphanesinin JObect sınıfını kullanın.

1- Sen Bu Linq destekler

var jObj = JObject.Parse(json1); 
if (jObj["object1"] != null) Console.WriteLine(jObj["object1"]["field1"]); 

3- sözlük olarak kullanabilir dynamic

string json1 = @"{object1 : {field1 : 1, field2: 2}}"; 
string json2 = @"{object2 : {field3 : 3, field2: 4}}"; 

dynamic obj = JObject.Parse(json2); 
if (obj.object1 != null) Console.WriteLine(obj.object1.field1); 
if (obj.object2 != null) Console.WriteLine(obj.object2.field3); 

2- ile kullanabilir. Sen vs bütün çocuklar/kökenini almak için kolayca numaralandırabilmesidir

var rootProperties = jObj.Children().OfType<JProperty>() 
        .Select(p => p.Name).ToArray(); 
+0

"Manual" ayrıştırma yapıyorum, aka: JSON.NET kullanmıyorum, dolayısıyla JObject'e erişimim yok. –

+1

@ T.Aoukar: JSON.NET'i kullanmaya başlayamaz mısınız? –

+0

@LuisFilipe Hayır, eğer yapabilirsem, bunu zaten yapardım. –

İlgili konular