2013-01-04 9 views
18

मैं .NET का उपयोग कर openexhangerates.org सर्वर पक्ष से JSON प्रतिक्रिया को पार्स करने के लिए JSON.NET का उपयोग कर रहा हूं।शब्दकोश में JSON.NET जॉब्जेक्ट की गुण/टोकन को कनवर्ट करना

{ 
    "disclaimer": "Exchange rates provided for informational purposes only, with no guarantee whatsoever of accuracy, validity, availability, or fitness for any purpose; use at your own risk. Other than that, have fun! Usage subject to acceptance of terms: http://openexchangerates.org/terms/", 
    "license": "Data sourced from various providers with public-facing APIs; copyright may apply; not for resale; no warranties given. Usage subject to acceptance of license agreement: http://openexchangerates.org/license/", 
     "timestamp": 1357268408, 
     "base": "USD", 
     "rates": { 
      "AED": 3.673033, 
      "AFN": 51.5663, 
      "ALL": 106.813749, 
      "AMD": 403.579996, 
      etc... 
     } 
    } 

संपत्ति नामों मुद्रा प्रकार के अनुरूप (जैसे, "अमरीकी डालर"): प्रतिक्रिया एक नेस्टेड वस्तु ("दर"), जो संख्यात्मक गुणों की एक लंबी सूची है शामिल हैं। मुझे यह मानने की ज़रूरत है कि गुणों की सूची समय के साथ बदल सकती है, इसलिए मैं वस्तु को इसी सी # ऑब्जेक्ट के बजाय एक शब्दकोश में परिवर्तित करना चाहता हूं।

बजाय कुछ इस तरह में JSON ऑब्जेक्ट deserializing की:

class Rates 
{ 
public decimal AED; // United Arab Emirates Dirham 
public decimal AFN; // Afghan Afghani 
public decimal ALL; // Albanian Lek 
public decimal AMD; // Armenian Dram 
// etc... 
} 

मैं इस के साथ खत्म करना चाहते हैं:

Dictionary<string,decimal>() {{"AED",0.2828},{"AFN",0.3373},{"ALL",2.2823},{"AMD",33.378} // etc...}; 

मैं ऐसा कैसे करते हैं यह या तो प्रतिक्रिया स्ट्रिंग से शुरू करने या JObject.Parse (प्रतिक्रिया स्ट्रिंग) को बुलाकर उत्पादित जॉब्जेक्ट से?

+1

क्या आपने सी # का उपयोग कर JSON को deserialize करने के तरीके पर Google खोज परिणामों को देखा है, इंटरनेट पर कई उदाहरण हैं .. http://stackoverflow.com/questions/6375122/how-to-parse-json-response- इन-डिक्शनरी – MethodMan

उत्तर

25

JObject पहले से ही IDictionary<string, JToken> लागू करता है, इसलिए मुझे लगता है कि जब आप rates पद छोड़कर सदस्य नेविगेट किया है, तो आप का उपयोग करने के लिए सक्षम होना चाहिए:

var result = rates.ToDictionary(pair => pair.Key, pair => (decimal) pair.Value); 

दुर्भाग्य से यह स्पष्ट इंटरफेस कार्यान्वयन, जो इस एक सा बना देता है का उपयोग करता है दर्द का - लेकिन यदि आप IDictionary<string, JToken> इंटरफ़ेस के माध्यम से जाते हैं, तो यह ठीक है।

यहाँ एक छोटा लेकिन पूर्ण उदाहरण JSON आपके द्वारा दिए गए (एक test.json फ़ाइल में सहेजा जाता है) के साथ काम करने में दिखाई देता है है:

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Linq; 
using Newtonsoft.Json.Linq; 

class Test 
{ 
    static void Main() 
    { 
     JObject parsed = JObject.Parse(File.ReadAllText("test.json")); 
     IDictionary<string, JToken> rates = (JObject) parsed["rates"]; 
     // Explicit typing just for "proof" here 
     Dictionary<string, decimal> dictionary = 
      rates.ToDictionary(pair => pair.Key, 
           pair => (decimal) pair.Value); 
     Console.WriteLine(dictionary["ALL"]); 
    } 
} 
+0

और मैं "दरों" पर कैसे 'नेविगेट' करूं? जब मैं जो ["दरें"] का उपयोग करने का प्रयास करता हूं, तो एक जॉबोकन वापस प्राप्त करें - जॉब्जेक्ट नहीं। – Emmanuel

+1

@Canoehead: आपको 'जॉब्जेक्ट' पर डालना होगा। एक पूर्ण उदाहरण के लिए मेरा संपादन देखें। –

+0

आप कभी भी अपने ज्ञान और मदद से आश्चर्यचकित नहीं रहेंगे! – Emmanuel

6

आप के लिए यह काम करता है?

Dictionary<string, object> rates = parsed["rates"].ToObject<Dictionary<string, object>>(); 

अन्यथा, यह एक त्रुटि फेंक देगा:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Newtonsoft.Json.Linq; 

namespace JsonNetTest 
{ 



    class Program 
    { 
     static void Main(string[] args) 
     { 

      string jsonString = @"{ 
       'disclaimer': 'Exchange rates provided for informational purposes only, with no guarantee whatsoever of accuracy, validity, availability, or fitness for any purpose; use at your own risk. Other than that, have fun! Usage subject to acceptance of terms: http://openexchangerates.org/terms/', 
       'license': 'Data sourced from various providers with public-facing APIs; copyright may apply; not for resale; no warranties given. Usage subject to acceptance of license agreement: http://openexchangerates.org/license/', 
       'timestamp': 1357268408, 
       'base': 'USD', 
       'rates': { 
        'AED': 3.673033, 
        'AFN': 51.5663, 
        'ALL': 106.813749, 
        'AMD': 403.579996 
       } 
      }"; 

      JObject parsed = JObject.Parse(jsonString); 

      Dictionary<string, decimal> rates = parsed["rates"].ToObject<Dictionary<string, decimal>>(); 

      Console.WriteLine(rates["ALL"]); 

      Console.ReadKey(); 

     } 
    } 
} 
1

आप एक वस्तु संपत्ति (या क्षेत्र) के लिए बच्चे को वस्तु की उम्मीद कर रहे हैं, यह उपयोग करने के लिए बेहतर है।

+0

मुझे यह चाबियों तक पहुंचने का सबसे आसान तरीका माना गया। मैंने जवाब देने के लिए आपका जवाब इस्तेमाल किया http://stackoverflow.com/questions/6522358/how-can-i-get-a-list-of-keys-from-json-net/ – Blairg23