反序列化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...
    }
}