2013-08-29 5 views
10

से एक ग # वस्तु मैं करने के लिए एक वेब सेवा से निम्नलिखित प्रतिक्रिया बनाने के लिए?कैसे json

या संपत्तियों के मूल्य प्राप्त करने का कोई और तरीका है? इस साइट बाहर

+0

क्या आप इसे deserialize करना चाहते हैं? – Shaharyar

+0

आपके प्रोग्राम में मिलने के बाद आप जानकारी के साथ क्या करना चाहते हैं? जबकि आप इसे किसी ऑब्जेक्ट में deserialize कर सकते हैं, यह हो सकता है कि आप अपने उद्देश्य के आधार पर काम कर सकते हैं। –

+0

आपके पास पहले से ही एक JSON ऑब्जेक्ट है। क्या आपका मतलब है कि इसे सी # ऑब्जेक्ट में अनुवाद कैसे करें? यदि ऐसा है तो गुण 'पथ', 'minVersion',' maxVersion' के साथ एक वर्ग बनाएं और desonialize करने के लिए JSON.NET जैसे कुछ का उपयोग करें। –

उत्तर

7

JSON.NET पुस्तकालय के साथ यह बहुत तुच्छ है:

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; } 
} 

और उसके बाद:

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); 

इस उदाहरण में मैं एक Dictionary<string, Data> वस्तु का इस्तेमाल किया है 2 जटिल कुंजियों (foo.hugo.info और foo.Fritz.Task) क्योंकि मॉडल करने के लिए उनमें ऐसे नाम होते हैं जिनका उपयोग .NET सदस्य में नहीं किया जा सकता है।

+0

डाउनवोट के लिए कोई कारण? कृपया यह बताएं कि यह जवाब गलत क्यों है, यह बताते हुए एक टिप्पणी छोड़ दें। –

+0

यह वही करता है जो मुझे चाहिए! इसके अलावा यह एक शब्दकोश का उपयोग करता है और दो से अधिक डेटा प्रविष्टियों को संभाल सकता है। धन्यवाद! – GreenEyedAndy

1

की जांच: json स्ट्रिंग में http://json2csharp.com/

चिपकाएं और यह आप के लिए कक्षाओं उत्पन्न होगा। रूट ऑब्जेक्ट के उदाहरण को deserialize करने के लिए मैं आमतौर पर JSON.NET के साथ इसका उपयोग करता हूं।

+1

JSON.NET मुखपृष्ठ: http://json.codeplex.com/ – valverij

+1

कृपया जेएसओएन को अधिक ध्यान से देखें और 'foo.hugo.info' और' foo.Fritz.Task' कुंजी देखें। अब 'डेटा' वर्ग के लिए जेनरेट की गई साइट को देखें - सुंदर बेकार। –

+0

अच्छा बिंदु। मुझे पहले साइट का उपयोग करने में कोई समस्या नहीं है। अपने बेहतर उत्तर के लिए +1। – stevepkr84

5

आप VS2012 या आप ऊपर उपयोग कर रहे हैं कर सकते हैं निम्नलिखित:

Edit > Paste Special > Paste JSON As Classes 

अपने उदाहरण के साथ, इस में जो परिणाम:

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

ओपी में दिखाए गए जेएसओएन को उन वर्गों में दिखाए गए जेएसओएन को deserialize करने के लिए आप किस serializer का उपयोग करेंगे? मैं विशेष रूप से 'foohugoinfo' और' fooFritzTask' गुणों में रूचि रखता हूं। –

+0

यह ओपी के प्रश्न का पूरी तरह से जवाब नहीं दे सकता है, लेकिन मुझे कहना है ... दिमाग = उड़ाया। मुझे नहीं पता था कि संपादन मेनू के तहत अब तक क्या पता चला है। –

+2

यह एक लचीला नहीं है, यदि कोई तीसरा संस्करण जोड़ा जाता है, तो आपको अभी तक एक और कक्षा बनाने की आवश्यकता होगी और इसे 'डेटा' श्रेणी में एक संपत्ति के रूप में जोड़ना होगा। – christiandev

1

आप उपयोग कर सकते हैं 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); 
    } 

संपादित करें: उसी कक्षा के लिए Info और Task

+0

आप 'जानकारी' और 'कार्य' के लिए एक ही कक्षा का उपयोग कर सकते थे। इसके अलावा, अच्छा और पूरा जवाब, +1। –

+0

मैंने अभी संपादन संपादित किया है :) –

+0

यह अच्छी तरह से काम करता है, लेकिन जो मैं लिखना भूल गया वह यह है कि डेटा: गतिशील है। यह विभिन्न वस्तुओं की कोई गिनती हो सकती है, लेकिन हर बार पथ, minVersion और maxVersion सदस्यों के साथ। केवल नाम (foo.hugo.info/foo.fritz.task) भिन्न हो सकते हैं। – GreenEyedAndy