C# 为什么反序列化会给我一个错误Newtonsoft.Json.JsonConvert? public List GetCoinMarket() { List coinMarket=新列表(); var URLWebAPI=”http://190.202.54.19/wsZeus/api/Account/Markets/Get"; 尝试 { 使用(var Client=new System.Net.Http.HttpClient()) { var JSON=Client.GetStringAsync(URLWebAPI); coinMarket=(列表)Newtonsoft.Json.JsonConvert.DeserializeObject(Json.Result); } } 捕获(例外情况除外) { System.Diagnostics.Debug.WriteLine(@“ERROR{0}”,例如Message); } 回归市场; }
这是投掷,我不知道为什么。看起来序列化部分有问题。但是我已经验证过了。我猜您的json结构成员与CoinMarket类成员不匹配 我要做的是复制json结果并在以下网站上生成相应的CoinMarket类:C# 为什么反序列化会给我一个错误Newtonsoft.Json.JsonConvert? public List GetCoinMarket() { List coinMarket=新列表(); var URLWebAPI=”http://190.202.54.19/wsZeus/api/Account/Markets/Get"; 尝试 { 使用(var Client=new System.Net.Http.HttpClient()) { var JSON=Client.GetStringAsync(URLWebAPI); coinMarket=(列表)Newtonsoft.Json.JsonConvert.DeserializeObject(Json.Result); } } 捕获(例外情况除外) { System.Diagnostics.Debug.WriteLine(@“ERROR{0}”,例如Message); } 回归市场; },c#,arrays,json,C#,Arrays,Json,这是投掷,我不知道为什么。看起来序列化部分有问题。但是我已经验证过了。我猜您的json结构成员与CoinMarket类成员不匹配 我要做的是复制json结果并在以下网站上生成相应的CoinMarket类: 它将为您输出正确的CoinMarket类。您使用的json反序列化程序不正确反序列化对象返回不可强制转换到列表中的自定义对象。此输出: public List<CoinMarket> GetCoinMarket() { List<CoinMarket> coin
它将为您输出正确的CoinMarket类。您使用的json反序列化程序不正确<代码>反序列化对象返回不可强制转换到
列表中的自定义对象
。此输出:
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;
}
是此代码的结果
Newtonsoft.Json.Linq.JArray
SO20171129.CoinData[]
System.Collections.Generic.List`1[SO20171129.CoinData]
类程序
{
静态void Main(字符串[]参数)
{
//返回Newtonsoft.Json.Linq.JArray
var coinMarket=Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(“get.Json”);
Console.WriteLine(coinMarket.GetType());
//返回数据的数组
var coinMarketTyped=Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(“get.Json”));
Console.WriteLine(coinMarketTyped.GetType());
//返回数据的列表
var coinMarketTyped2=Newtonsoft.Json.JsonConvert.DeserializeObject(File.ReadAllText(“get.Json”);
Console.WriteLine(coinMarketTyped2.GetType());
}
}
公共类数据
{
公共字符串id{get;set;}
公共字符串名称{get;set;}
公共字符串符号{get;set;}
公共字符串秩{get;set;}
公共字符串price_usd{get;set;}
公共字符串price_btc{get;set;}
公共字符串uuu无效uuu名称uuuuu 24小时u卷u美元{get;set;}
公共字符串市场_cap_usd{get;set;}
公共字符串可用\u提供{get;set;}
公共字符串total_supply{get;set;}
公共字符串百分比\u更改\u 1h{get;set;}
公共字符串百分比\u更改\u 24小时{get;set;}
公共字符串百分比\u更改\u 7d{get;set;}
上次更新的公共字符串{get;set;}
}
}
这是我的CoinMarket课程请用完整的异常详细信息更新问题。另外,您不应该使用
.Result
阻塞异步代码。如果代码不异步兼容,则不要使用HttpClient
。发布实际错误/stacktrace以及转到时生成的JSON响应。如果需要异常帮助,则应提供异常详细信息,包括堆栈跟踪。我打赌你会得到广告InvalidCastException
。您必须使用泛型版本的反序列化对象
来反序列化到特定类型。不,您的JSON变量实际上是一个任务
。@Crowcoder“…那么即使在控制台应用程序中也不要使用HttpClient”?提示:请下次对代码进行更好的格式化,我现在已经完成了。它帮助每个人,尤其是你自己(获得答案)。忘了提一下,有很多在线工具可以为任何JSON
生成POCO
。我在上面的例子中使用了json2csharp.com。听起来你是对的。唯一奇怪的是,@IgorMiquilena得到了一个AggregateException…@Allrameest,因为没有关于异常的详细信息。如果在主题启动者试图让事情正常运行时,对于过于频繁的调用(即DoS保护)出现http错误,我不会感到惊讶。我从前面提到的url获得了json,没有任何问题,尽管使用IE.@Allrameest这并不奇怪,这是.Result
的另一个副作用,它只能抛出聚合异常。@Crowcoder是的,这是使用.Result的一个大缺点。当然更喜欢异步等待。我的意思是Alex指出的序列化错误可能不会导致AggregateException。
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; }
}
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; }
}