問題描述
我正在使用 JSON.NET 來解析來自 openexhangerates.org 服務器端的 JSON 響應.響應包含一個嵌套對象(rates"),其中包含一長串數字屬性:
I'm using JSON.NET to parse a JSON reponse from openexhangerates.org server side using .NET. The response contains a nested object ("rates") which has a long list of numeric properties:
{
"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...
}
}
屬性名稱對應于貨幣類型(例如USD").我需要假設屬性列表會隨著時間而改變,所以我想將對象轉換為 Dictionary 而不是對應的 C# 對象.
The property names correspond to the currency type (e.g. "USD"). I need to assume that the list of properties can change over time, so I want to convert the object into a Dictionary instead of a corresponding C# object.
所以不要將 JSON 對象反序列化成這樣的東西:
So instead of deserializing the JSON object into something like this:
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(responseString) 生成的 JObject 開始?
How do I do this starting from either the response string or from the JObject produced by calling JObject.Parse(responseString)?
推薦答案
JObject
已經實現了 IDictionary
,所以我懷疑當你導航到 rates
成員,您應該可以使用:
JObject
already implements IDictionary<string, JToken>
, so I suspect that when you've navigated down to the rates
member, you should be able to use:
var result = rates.ToDictionary(pair => pair.Key, pair => (decimal) pair.Value);
不幸的是,它使用顯式接口實現,這讓這有點痛苦 - 但如果你通過 IDictionary
接口,那就沒問題了.
Unfortunately it uses explicit interface implementation, which makes this a bit of a pain - but if you go via the IDictionary<string, JToken>
interface, it's fine.
這是一個簡短但完整的示例,它似乎適用于您提供的 JSON(保存到 test.json
文件中):
Here's a short but complete example which appears to work with the JSON you've provided (saved into a test.json
file):
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"]);
}
}
這篇關于將 JSON.NET JObject 的屬性/標記轉換為字典鍵的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!