JSON反序列化报Invalid Json错误,求RestSharp+C#解决方案
解决沃尔玛API JSON反序列化「Invalid Json」错误的几个关键点
我之前也碰到过类似的坑,结合你的代码和场景,大概率是这几个原因导致的,一步步来排查:
1. 先修正URL里的HTML转义字符
你代码里的URL用了&分隔参数,这是HTML的转义字符,直接放在请求URL里会被RestSharp当成参数的一部分,导致沃尔玛API无法正确识别upc参数,返回的可能不是预期的JSON,而是错误页面(比如400 Bad Request的HTML),自然会触发「Invalid Json」错误。
把URL里的&换成普通的&:
string url = "http://api.walmartlabs.com/v1/items?apiKey=3zmwbajjf4ugzqhdtgsf59ac&upc=029986182548";
2. 确认API返回的内容是否是有效JSON
在反序列化之前,先打印或调试查看response.Content的内容,确认返回的是合法的JSON,而不是错误信息:
IRestResponse response = client.Execute(request); // 调试时输出响应内容,验证是否为有效JSON Console.WriteLine(response.Content); // 同时检查请求是否成功 if (!response.IsSuccessful) { Console.WriteLine($"请求失败,状态码:{response.StatusCode}"); return; }
如果这里输出的是HTML错误页面,那先解决请求本身的问题(比如参数错误、API密钥无效等)。
3. 反序列化的目标类型错误:单个对象 vs 数组
沃尔玛的/v1/items API返回的是商品数组(即使只匹配到单个商品,也是长度为1的数组),而你现在直接反序列化为单个WallMartData对象,会导致JSON结构不匹配,触发反序列化错误。
你需要把反序列化的目标改成List<WallMartData>:
var deserializer = new JsonDeserializer(); // 反序列化为列表 var wmrList = deserializer.Deserialize<List<WallMartData>>(response); // 如果只需要第一个匹配的商品 var wmr = wmrList.FirstOrDefault();
或者用RestSharp更简洁的泛型请求方式:
var client = new RestClient(url); var request = new RestRequest(Method.GET); // 直接请求并反序列化为列表 var response = client.Execute<List<WallMartData>>(request); if (response.IsSuccessful) { var wmrList = response.Data; // 后续处理逻辑 }
4. 额外优化:模型类的字段兼容性
你用json2csharp生成的模型类基本没问题,但有几个小细节可以优化:
customerRating字段:如果API返回的是数值(比如4.5),可以改成double?类型(支持null值)stock字段:如果可能返回null,改成string?(C# 8.0+)- 空的
GiftOptions类可以保留,或者改成object类型,不影响反序列化
按照这几步调整后,应该就能解决你的「Invalid Json」错误了。
内容的提问来源于stack exchange,提问作者Nitika Pondith
相关产品推荐
相关产品推荐

