2013-08-29 14 views
10

bir C# nesnesi yapmak için?Nasıl bir webcoder aşağıdaki yanıt almak json

Veya özelliklerin değerlerini almanın başka bir yolu var mı? Bu sitenin dışında

+0

Bunu seri hale getirmek mi istiyorsunuz? – Shaharyar

+0

Bilgilerinizi programınıza aldıktan sonra ne yapmak istiyorsunuz? Onu bir nesneye dönüştürebilirken, hedefinize bağlı olarak kaçınabileceğiniz bir iş olabilir. –

+0

Zaten bir JSON nesnesiniz var. C# nesnesine nasıl dönüştürüleceğini kastediyor musunuz? Eğer öyleyse 'path',' minVersion', 'maxVersion' özelliklerine sahip bir sınıf oluşturun ve serileştirmek için JSON.NET gibi bir şey kullanın. –

cevap

7

oldukça Önemsiz: o zaman

public class Root 
{ 
    public Dictionary<string, Data> Data { get; set; } 
    public bool Success { get; set; } 
} 

public class Data 
{ 
    public string Path { get; set; } 
    public int MinVersion { get; set; } 
    public int MaxVersion { get; set; } 
} 

ve:

string json = 
@"{ 
    ""data"":{ 
    ""foo.hugo.info"": { 
     ""path"": ""logon.cgi"", 
     ""minVersion"": 1, 
     ""maxVersion"": 2 
    }, 
    ""foo.Fritz.Task"": { 
     ""path"": ""Fritz/process.cgi"", 
     ""minVersion"": 1, 
     ""maxVersion"": 1 
    } 
    }, 
    ""success"": true 
}"; 
Root root = JsonConvert.DeserializeObject<Root>(json); 

Ben 2 kompleks anahtarları (foo.hugo.info ve foo.Fritz.Task) çünkü modellemek için bir Dictionary<string, Data> nesneyi kullanmış Bu örnekte .NET üyesi olarak kullanılamayan adlar içerir.

+0

Reddetmenin herhangi bir nedeni var mı? Bu cevabın niçin yanlış olduğunu açıklayan bir oylamada lütfen yorum bırakın. –

+0

Tam olarak ihtiyacım olanı yapar! Ayrıca bir sözlük kullanır ve ikiden fazla veri girişi yapabilir. Teşekkür ederim! – GreenEyedAndy

1

Kontrol: json dizesinde http://json2csharp.com/

Yapıştır ve sizin için sınıflar oluşturur. Ben genellikle Kök Nesnenin bir örneğini serileştirmek için JSON.NET ile birlikte kullanırım. JSON.NET kütüphanesi ile

+1

JSON.NET anasayfa: http://json.codeplex.com/ – valverij

+1

Lütfen JSON'a daha dikkatli bir şekilde bakın ve 'foo.hugo.info' ve' foo.Fritz.Task' tuşlarını dikkat edin. Şimdi 'Data' sınıfı için önerdiğiniz sitenin ne işe yaradığını görünüz - işe yaramaz. –

+0

İyi nokta. Siteyi daha önce kullanma konusunda sorun yaşamadım. Daha iyi cevabınız için +1. – stevepkr84

5

Yapabileceğiniz VS2012 veya yukarıda kullanıyorsanız aşağıdaki: En örnekle

Edit > Paste Special > Paste JSON As Classes 

, bu sonuçlanır:

public class Rootobject 
{ 
    public Data data { get; set; } 
    public bool success { get; set; } 
} 

public class Data 
{ 
    public FooHugoInfo foohugoinfo { get; set; } 
    public FooFritzTask fooFritzTask { get; set; } 
} 

public class FooHugoInfo 
{ 
    public string path { get; set; } 
    public int minVersion { get; set; } 
    public int maxVersion { get; set; } 
} 

public class FooFritzTask 
{ 
    public string path { get; set; } 
    public int minVersion { get; set; } 
    public int maxVersion { get; set; } 
} 
+1

OP'de gösterilen JSON'u bu sınıflara serpmek için hangi serileştiriciyi kullanacağınız hakkında herhangi bir kod örneği? Özellikle foohugoinfo ve fooFritzTask özellikleriyle ilgileniyorum. –

+0

Bu, OP'nin sorusunu tam olarak cevaplayamayabilir, ama şunu söylemeliyim ... akıl = şişmiş. Şu ana kadar düzenleme menüsünün altında neler olduğuna dair hiçbir fikrim yoktu. –

+2

Bu esnek değildir, üçüncü bir varyant eklenirse, başka bir sınıf oluşturmanız ve bunu "Data" sınıfına bir özellik olarak eklemeniz gerekir. – christiandev

1

kullanabilirsiniz DataContractJsonSerializer

[DataContract] 
    public class DetailedData 
    { 
     [DataMember(Name="path")] 
     public string Path { get; set; } 
     [DataMember(Name = "minVersion")] 
     public int MinVersion { get; set; } 
     [DataMember(Name = "maxVersion")] 
     public int MaxVersion { get; set; } 
    } 

    [DataContract] 
    public class Data 
    { 
     [DataMember(Name = "foo.hugo.info")] 
     public DetailedData Info { get; set; } 
     [DataMember(Name = "foo.Fritz.Task")] 
     public DetailedData Task { get; set; } 
    } 

    [DataContract] 
    public class RootObject 
    { 
     [DataMember(Name = "data")] 
     public Data Data { get; set; } 
     [DataMember(Name = "success")] 
     public bool Success { get; set; } 
    } 

    static void Main(string[] args) 
    { 
     string json = "..."; 
     DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(RootObject)); 

     RootObject obj = (RootObject)js.ReadObject(new MemoryStream(Encoding.Unicode.GetBytes(json))); 
     Console.WriteLine(obj.Data.Task.MaxVersion); 
    } 

Düzenleme: aynı sınıf Info ve Task

+0

"Bilgi" ve "Görev" için aynı sınıfı kullanmış olabilirsiniz. Bunun dışında iyi ve eksiksiz bir cevap, +1. –

+0

Düzenlemeyi yeni bitirdim :) –

+0

Bu iyi çalışıyor, ama yazmayı unuttum, bu veri: dinamik. Farklı öğelerin herhangi bir sayısı olabilir, ancak her zaman, yol, minimum ve maksimum üyeler ile. Sadece isimler (foo.hugo.info/foo.fritz.task) değişebilir. – GreenEyedAndy

İlgili konular