简体   繁体   中英

Why my deserialization is giving me an error Newtonsoft.Json.JsonConvert?

public List<CoinMarket> GetCoinMarket()
{
    List<CoinMarket> coinMarket = new List<CoinMarket>();
    var URLWebAPI = "http://190.202.54.19/wsZeus/api/Account/Markets/Get";
    try
    {
        using (var Client = new System.Net.Http.HttpClient())
        {
            var JSON =  Client.GetStringAsync(URLWebAPI);
            coinMarket = (List<CoinMarket>)Newtonsoft.Json.JsonConvert.DeserializeObject(JSON.Result);
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(@"    ERROR {0}", ex.Message);
    }
    return coinMarket;
}

It is throwing and i do not know why. It looks like there is something wrong with the serialization part. But i verified it.

You are using json deserializer incorrectly. DeserializeObject returns custom object which is not castable to your List<T> . This output:

Newtonsoft.Json.Linq.JArray
SO20171129.CoinData[]
System.Collections.Generic.List`1[SO20171129.CoinData]

is the result of this code.

class Program
{
    static void Main(string[] args)
    {
        // returns Newtonsoft.Json.Linq.JArray
        var coinMarket = Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText("get.json"));
        Console.WriteLine(coinMarket.GetType());
        // returns array of CoinData
        var coinMarketTyped = Newtonsoft.Json.JsonConvert.DeserializeObject<CoinData[]>(File.ReadAllText("get.json"));
        Console.WriteLine(coinMarketTyped.GetType());
        // returns List of CoinData
        var coinMarketTyped2 = Newtonsoft.Json.JsonConvert.DeserializeObject<List<CoinData>>(File.ReadAllText("get.json"));
        Console.WriteLine(coinMarketTyped2.GetType());
    }
}

public class CoinData
{
    public string id { get; set; }
    public string name { get; set; }
    public string symbol { get; set; }
    public string rank { get; set; }
    public string price_usd { get; set; }
    public string price_btc { get; set; }
    public string __invalid_name__24h_volume_usd { get; set; }
    public string market_cap_usd { get; set; }
    public string available_supply { get; set; }
    public string total_supply { get; set; }
    public string percent_change_1h { get; set; }
    public string percent_change_24h { get; set; }
    public string percent_change_7d { get; set; }
    public string last_updated { get; set; }
}

My guess is that your json structure members do not match the CoinMarket class members.

What I would do is to copy the json result and generate the corresponding CoinMarket class on the following website: http://json2csharp.com/

It will output the right CoinMarket class for you.

 public class CoinMarket
{
    public string id { get; set; }
    public string name { get; set; }
    public string symbol { get; set; }
    public string rank { get; set; }
    public string price_usd { get; set; }
    public string price_btc { get; set; }
    [JsonProperty("24h_volume_usd")]
    public string h_volume_usd { get; set; }
    public string market_cap_usd { get; set; }
    public string available_supply { get; set; }
    public string total_supply { get; set; }
    public string percent_change_1h { get; set; }
    public string percent_change_24h { get; set; }
    public string percent_change_7d { get; set; }
    public string last_updated { get; set; }

}

}

This is my CoinMarket Class

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM