2013-10-25 3 views
5

के साथ JSON फ़ाइलों को पढ़ना मुझे जेएसओएन फ़ाइल पढ़ने के लिए JSON.net का उपयोग करने का तरीका समझने में कुछ परेशानी है।सी # और JSON.net

फ़ाइल इस तरह देख रहा है:

"version": { 
    "files": [ 
     { 
      "url": "http://www.url.com/", 
      "name": "someName" 
     }, 
     { 
      "name": "someOtherName" 
      "url": "http://www.url.com/" 
      "clientreq": true 
     }, .... 

मैं वास्तव में बहुत विचार कैसे मैं इस फाइल को पढ़ सकते हैं की जरूरत नहीं है .. मैं क्या करने की जरूरत है लाइनों के माध्यम से पढ़ सकते हैं और फ़ाइल डाउनलोड करने के लिए है " यूआरएल ".. मुझे पता है कि फ़ाइलों को कैसे डाउनलोड करें और इसी तरह, लेकिन मुझे नहीं पता कि मैं JSON.net का उपयोग प्रत्येक अनुभाग के माध्यम से जेसन फ़ाइल और लूप पढ़ने के लिए कैसे कर सकता हूं और फ़ाइल डाउनलोड कर सकता हूं ..

क्या आप सहायता कर सकते हैं?

उत्तर

8

सबसे आसान तरीका है तो फिर तुम उसके गुण यूआरएल

dynamic result = Newtonsoft.Json.JsonConvert.DeserializeObject(jsonString); 

var urls = new List<string>(); 

foreach(var file in result.version.files) 
{ 
    urls.Add(file.url); 
} 
+0

मैं इस विधि का उपयोग कर समाप्त हुआ क्योंकि यह काम करने के लिए सबसे आसान लग रहा था! बहुत बहुत धन्यवाद। जानकारी के लिए मैंने readtoend के साथ फ़ाइल की सामग्री को पढ़ने के लिए स्ट्रीमreader का उपयोग किया, जिसे मैंने "jsonString" –

5

http://json2csharp.com/ आप के आधार पर सी # कक्षाएं बनाने में मदद करता है प्राप्त करने के लिए एक पाश का उपयोग कर सकते इस

की तरह एक गतिशील वस्तु में अपने json deserialize करने के लिए है अपने JSON डेटा प्रकार। एक बार जब आप अपनी कक्षाओं अपने डेटा मैच के लिए है, तो आप Json.NET साथ deserialize कर सकते हैं और फिर अपने डेटा के साथ काम:

var myMessage = JsonConvert.DeserializeObject<MyMessage>(myString); 
foreach (var file in myMessage.Version.Files) 
{ 
    // download file.Url 
} 

या आप एक dynamic वस्तु के रूप में इसे का उपयोग कर सकते हैं:

dynamic myMessage = JsonConvert.DeserializeObject(myString); 
foreach (var file in myMessage.version.files) 
{ 
    // download file.url 
} 

आप वर्गों का उपयोग करते हैं , वे हो सकता है:

public class File 
{ 
    public Uri Url { get; set; } 
    public string Name { get; set; } 
    public bool? ClientReq { get; set; } 
} 

public class Version 
{ 
    public IList<File> Files { get; set; } 
} 

public class MyMessage 
{ 
    public Version Version { get; set; } 
} 

(ध्यान दें कि Json.Net बहुत चालाक गुण जहां मामला अलग होता है मैप करने के लिए है, और उरी वस्तुओं में URL को एक) यह स्ट्रिंग की तरह काम करता है:

string myString = @"{""version"": { 
    ""files"": [ 
     { 
      ""url"": ""http://www.url.com/"", 
      ""name"": ""someName"" 
     }, 
     { 
      ""name"": ""someOtherName"", 
      ""url"": ""http://www.url.com/"", 
      ""clientreq"": true 
     }]}}"; 
+0

"नोट किया कि" Json.Net उन गुणों को मैप करने के लिए पर्याप्त स्मार्ट है जहां मामला अलग है "यह बिल्कुल सही नहीं है, आपको आवश्यकता है उस के लिए CamelCasePropertyNamesContractResolver का उपयोग करने के लिए। –

+1

@EstebanElverdin ऐसा लगता है कि डिफ़ॉल्ट रूप से ऐसा होता है, फिर, क्योंकि कोड जो मुझे मिला है, (जो 'क्लाइंटरेक' को' क्लाइंटरैक' 'पर नक्शा देता है) स्पष्ट रूप से किसी भी अनुबंध रिज़ॉल्वर को निर्दिष्ट किए बिना। –

+0

हाँ, आप सही हैं, इसे अपने उदाहरण में करने की कोई ज़रूरत नहीं है, मैं कुछ कोड की समीक्षा करूंगा जो मैं काम कर रहा था और देखता हूं कि यह डिफ़ॉल्ट रूप से ऐसा क्यों नहीं करता है। –