2013-01-04 28 views
18

Tôi đang sử dụng JSON.NET để phân tích cú pháp phản hồi JSON từ phía máy chủ openexhangerates.org bằng .NET. Câu trả lời có chứa một đối tượng lồng nhau ("lãi") trong đó có một danh sách dài các tính chất số:Chuyển đổi thuộc tính/mã thông báo của JSON.NET JObject thành các phím từ điển

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

các tên thuộc tính tương ứng với các loại tiền tệ (ví dụ "USD"). Tôi cần phải giả định rằng danh sách các thuộc tính có thể thay đổi theo thời gian, vì vậy tôi muốn chuyển đổi đối tượng thành một từ điển thay vì một đối tượng C# tương ứng.

Vì vậy, thay vì deserializing đối tượng JSON thành một cái gì đó như thế này:

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

Tôi muốn kết thúc với điều này:

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

Làm thế nào để làm điều này bắt đầu từ một trong hai chuỗi phản ứng hoặc từ JObject được tạo ra bằng cách gọi JObject.Parse (responseString)?

+1

bạn đã xem kết quả tìm kiếm của google về cách deserialize JSON bằng cách sử dụng C# có rất nhiều ví dụ trên internet .. http://stackoverflow.com/questions/6375122/how-to-parse-json-response- vào từ điển – MethodMan

Trả lời

25

JObject đã thực hiện IDictionary<string, JToken>, vì vậy tôi nghi ngờ rằng khi bạn đã lèo lái xuống rates thành viên, bạn sẽ có thể sử dụng:

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

Đáng tiếc là nó sử dụng thực hiện giao diện rõ ràng, mà làm điều này một chút của một nỗi đau - nhưng nếu bạn đi qua giao diện IDictionary<string, JToken>, nó ổn.

Dưới đây là một ví dụ ngắn nhưng đầy đủ mà dường như làm việc với JSON bạn đã cung cấp (được lưu vào một tập tin 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

Và làm cách nào để 'điều hướng' thành "giá"? Khi tôi thử dùng jo ["rate"], lấy lại JToken - không phải là JObject. – Emmanuel

+1

@Canoehead: Bạn cần truyền tới 'JObject'. Xem bản chỉnh sửa của tôi để biết ví dụ đầy đủ. –

+0

Bạn không bao giờ ngừng ngạc nhiên với kiến ​​thức và sự hữu ích của bạn! – Emmanuel

6

Điều này làm việc cho bạn?

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

Nếu bạn đang mong các đối tượng trẻ em có một tài sản đối tượng (hoặc trường), nó tốt hơn để sử dụng:

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

Nếu không, nó sẽ ném ra một lỗi.

+0

Tôi thấy đây là phương pháp truy cập các phím đơn giản nhất. Tôi đã sử dụng câu trả lời của bạn để trả lời http://stackoverflow.com/questions/6522358/how-can-i-get-a-list-of-keys-from-json-net/ – Blairg23

Các vấn đề liên quan