【发布时间】:2017-07-03 08:31:05
【问题描述】:
我正在尝试将 json 结果反序列化为想要的对象。我得到的结果是:
{
"base": "EUR",
"date": "2017-06-30",
"rates": {
"AUD": 1.4851,
"BGN": 1.9558,
"BRL": 3.76,
"CAD": 1.4785
}
}
我希望这个结果反序列化为我的对象:
public class ExchangeRates
{
public string Base { get; set; }
public DateTime Date { get; set; }
public IList<Rates> Rates { get; set; }
}
public class Rates
{
public string Name { get; set; }
public decimal Value { get; set; }
}
我的反序列化如下所示:
using (var httpClient = new HttpClient())
{
var response = httpClient.GetAsync("http://api.fixer.io/latest").Result;
var result = response.Content.ReadAsStringAsync().Result;
var values = JsonConvert.DeserializeObject<ExchangeRates>(result);
}
当我运行程序时,出现以下异常:
Newtonsoft.Json.JsonSerializationException: '无法将当前 JSON 对象(例如 {"name":"value"}) 反序列化为类型 'System.Collections.Generic.List`1[ConsoleApp4.Rates]' 因为该类型需要正确反序列化的 JSON 数组(例如 [1,2,3])。 要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。 JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。 路径“rates.AUD”,第 1 行,位置 49。
如何将 JSON 反序列化为我想要的对象??
更新 1
或者我可以反序列化“rates”列表?
【问题讨论】:
-
基本上,你没有
List<Rates>- 你有一个Dictionary<string, decimal> -
@JonSkeet 是的,我看到使用 Dictionary
工作正常,但是在反序列化后我需要将该字典映射到列表,因为我需要将所有这些汇率放入 DB,所以我想也许我可以将 JSON 反序列化为我想要的对象,所以我不需要映射 -
它们在字典中并不会阻止您将它们放入 Db 中
-
假设您不关心订单,您可以轻松创建一个列表:
rateDictionary.Select(kvp => new Rates { Name = kvp.Key, Value = kvp.Value }).ToList() -
你能改变Json吗?如果没有,字典就是要走的路
标签: c# json serialization