2013-01-04 16 views
18

.NET kullanarak openexhangerates.org sunucu tarafındaki JSON yanıtını ayrıştırmak için JSON.NET kullanıyorum.JSON.NET JObject'un Özellikleri/Jetonları Sözlük Anahtarlarına Dönüştürme

{ 
    "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... 
     } 
    } 

özellik adları (örneğin, "ABD") birimi tipine tekabül: yanıt sayısal özellikleri uzun bir listesine sahip bir iç içe nesne ("oranları") içerir. Özelliklerin zaman içinde değişebileceğini varsayalım, bu yüzden nesneyi karşılık gelen bir C# nesnesi yerine bir Sözlük'e dönüştürmek istiyorum.

Bunun yerine böyle bir şey haline JSON nesnesi deserializing ait:

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

Ben bu ile bitirmek istiyorum:

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

yapayım nasıl bu ya tepki dize başlayarak veya JObject'den JObject.Parse (responseString) 'i arayarak üretti?

+1

C# kullanarak JSON'un nasıl seri hale getirileceğine dair Google arama sonuçlarına baktık. İnternet üzerinde çok sayıda örnek var .. http://stackoverflow.com/questions/6375122/how-to-parse-json-response- in-dictionary – MethodMan

cevap

25

JObject zaten IDictionary<string, JToken> uygular, bu yüzden rates üyesine aşağı navigasyon ettik zaman, kullanmak mümkün olmalıdır şüpheli:

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

Ne yazık ki bu biraz kılan açık arabirim uygulaması kullanır Bir ağrının - ama eğer IDictionary<string, JToken> arabiriminden geçerseniz, sorun yok.

İşte (bir test.json dosyaya kaydedilir) sağladığınız JSON çalışmak için görünen kısa ama tam bir örnek:

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

Ve nasıl "oranları" için 'gezinmek'? Jo ["rates"] kullanmayı denediğimde, bir JToken geri alın - bir JObject değil. – Emmanuel

+1

@Canoehead: "JObject" 'e gitmeniz gerekiyor. Tam bir örnek için düzenlememe bakın. –

+0

Bilginizi ve yardımseverliğinizi şaşırtmaya hiç son vermediniz! – Emmanuel

6

sizin için bu çalışır mı?

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

Aksi takdirde, bir hata atar:

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

bir nesne özelliği (veya alan) olması alt nesne bekliyorsanız, kullanımı daha iyidir.

+0

Anahtarlara erişmenin en basit yolu olarak bunu buldum. Cevabınızı http://stackoverflow.com/questions/6522358/how-can-i-get-a-list-of-keys-from-json-net/ adresine cevap vermek için kullandım – Blairg23