反序列化Json C#错误
嗯,我是编程新手,我有个问题 这是我的班级,瓦洛雷斯反序列化Json C#错误,c#,.net,json,C#,.net,Json,嗯,我是编程新手,我有个问题 这是我的班级,瓦洛雷斯 public class Valores { [JsonProperty("nome")] public string Nome { get; set; } [JsonProperty("valor")] public double Valor { get; set; } [JsonProperty("ultima_consulta")]
public class Valores
{
[JsonProperty("nome")]
public string Nome { get; set; }
[JsonProperty("valor")]
public double Valor { get; set; }
[JsonProperty("ultima_consulta")]
public int UltimaConsulta { get; set; }
[JsonProperty("fonte")]
public string Fonte { get; set; }
}
这是我获取并反序列化Json的方法
public static async Task<Valores> GetAsync()
{
Valores valores = null;
using (var client = new HttpClient())
{
var json = await client.GetStringAsync("http://api.promasters.net.br/cotacao/v1/valores");
valores = JsonConvert.DeserializeObject<Valores>(json);
}
return valores;
}
我不知道我做错了什么,因为
var json=await client.GetStringAsync(“”)
它本来是接收字符串形式的Json,但没有接收任何内容,就像一个空字符串。这里的问题是反序列化的Json没有正确地映射到对象。尝试在模型(Valores)上创建一个包装器类,然后尝试映射
public class Valores
{
[JsonProperty("nome")]
public string Nome { get; set; }
[JsonProperty("valor")]
public double Valor { get; set; }
[JsonProperty("ultima_consulta")]
public int UltimaConsulta { get; set; }
[JsonProperty("fonte")]
public string Fonte { get; set; }
}
public class ValoresList
{
public boolean status { get; set; }
public Valores USD { get; set; }
public Valores EUR { get; set; }
public Valores ARS { get; set; }
public Valores GBP { get; set; }
public Valores BTC { get; set; }
}
然后将包装器类映射到反序列化的json
public static async Task<ValoresList> GetAsync()
{
ValoresList valores = null;
using (var client = new HttpClient())
{
var json = await client.GetStringAsync("http://api.promasters.net.br/cotacao/v1/valores");
valores = JsonConvert.DeserializeObject<ValoresList>(json);
}
return valores;
}
公共静态异步任务GetAsync()
{
ValoresList valores=null;
使用(var client=new HttpClient())
{
var json=await client.GetStringAsync(“http://api.promasters.net.br/cotacao/v1/valores");
valores=JsonConvert.DeserializeObject(json);
}
返回谷;
}
我做了一些实验,网站似乎需要将请求字符串设置为某个值,以便返回JSON。我所说的某物是指字符串
“something”
,就像字符串“Wget/1.11.4”
一样。您应该检查(葡萄牙语)以确保对本网站的编程访问没有限制,并遵守这些访问限制(如果有)
此外,数据模型并不反映JSON。您需要一个更高级别的根对象,如下所示:
public class RootObject
{
public RootObject() { this.valores = new Dictionary<string, Valores>(); }
public bool status { get; set; }
public Dictionary<string, Valores> valores { get; set; }
}
我认为应该(未经测试):
公共静态异步任务GetAsync()
{
var client=新的HttpClient();
client.DefaultRequestHeaders.Add(“用户代理”,“某物”);
var json=await client.GetStringAsync(“http://api.promasters.net.br/cotacao/v1/valores");
返回JsonConvert.DeserializeObject(json);
}
另请参见关于是否处理
HttpClient
的讨论。问题是返回的json包含字典中的Valore集合,您试图将响应映射到单个Valore对象
您的容器希望看起来像这样。字典的键是货币的字符串表示形式
class Container
{
public bool Status { get; set; }
public Dictionary<string, ValorInfo> Valores { get; set; }
}
最后,这就是你如何使用它,@dbc发现用户代理需求的道具,这让我很困惑
async void Main()
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "linqpad");
var response = await client.GetAsync("http://api.promasters.net.br/cotacao/v1/valores");
response.EnsureSuccessStatusCode();
var container = await response.Content.ReadAsAsync<Container>();
// do stuff with container...
}
}
async void Main()
{
使用(var client=new HttpClient())
{
client.DefaultRequestHeaders.Add(“Accept”、“application/json”);
client.DefaultRequestHeaders.Add(“用户代理”、“linqpad”);
var response=wait client.GetAsync(“http://api.promasters.net.br/cotacao/v1/valores");
response.EnsureSuccessStatusCode();
var container=wait response.Content.ReadAsAsync();
//用容器做东西。。。
}
}
public static async Task<RootObject> GetAsync()
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("User-Agent", "something");
var json = await client.GetStringAsync("http://api.promasters.net.br/cotacao/v1/valores");
return JsonConvert.DeserializeObject<RootObject>(json);
}
class Container
{
public bool Status { get; set; }
public Dictionary<string, ValorInfo> Valores { get; set; }
}
class ValorInfo
{
[JsonProperty("nome")]
public string Nome { get; set; }
[JsonProperty("valor")]
public double Valor { get; set; }
[JsonProperty("ultima_consulta")]
public int UltimaConsulta { get; set; }
[JsonProperty("fonte")]
public string Fonte { get; set; }
}
async void Main()
{
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.Add("Accept", "application/json");
client.DefaultRequestHeaders.Add("User-Agent", "linqpad");
var response = await client.GetAsync("http://api.promasters.net.br/cotacao/v1/valores");
response.EnsureSuccessStatusCode();
var container = await response.Content.ReadAsAsync<Container>();
// do stuff with container...
}
}