我使用JSON.NET通过.NET解析来自openexhangerates.org服务器端的JSON响应,该响应包含一个嵌套对象("rates"),该对象具有一长串数字属性:
{
"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")。我需要假设属性列表可以随着时间的推移而变化,因此我希望将对象转换为字典,而不是相应的C#对象。
因此,不是将JSON对象反序列化为如下所示:
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开始?
发布于 2013-01-05 01:15:03
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"]);
}
}
发布于 2014-01-21 09:54:29
这对你有效吗?
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();
}
}
}
发布于 2015-10-10 18:54:52
如果您希望子对象具有对象属性(或字段),最好使用:
Dictionary<string, object> rates = parsed["rates"].ToObject<Dictionary<string, object>>();
否则,它将抛出错误。
https://stackoverflow.com/questions/14161615
复制相似问题