c# - 控制台应用无法反序列化 JSON
问题描述
执行代码时收到以下错误:
JsonSerializationException:无法将当前 JSON 对象(例如 {"name":"value"})反序列化为类型“AzureWinWorkloadList.AzureWinWorkloadList+Data[]”,因为该类型需要 JSON 数组(例如 [1,2,3])来反序列化正确。要修复此错误,请将 JSON 更改为 JSON 数组(例如 [1,2,3])或更改反序列化类型,使其成为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。路径“SkipToken”,第 2 行,位置 14。
这是一个独立的控制台应用程序,不是 MVC 类型项目的一部分。此外,这在几周前对我有用,但是当我回到它时,现在我得到了那个错误。
这是我的 JSON 的样子:
{
"SkipToken": null,
"Data": [
{
"name": "5678-PLACE-32",
"OSType": "Windows",
"CompName": "COMPUTER001",
"RGName": "RG1234",
"SubID": "AA1234567891011",
"SubName": "SUBNAME-Tool"
},
{
"name": "5678-PLACE-33",
"OSType": "Windows",
"CompName": "SERVER001",
"RGName": "RG1234",
"SubID": "AB1234567891011",
"SubName": "SUBNAME-Tool"
},
{
"name": "5678-PLACE-34",
"OSType": "Windows",
"CompName": "COMPUTER002",
"RGName": "RG1234",
"SubID": "AC1234567891011",
"SubName": "SUBNAME-Tool"
},
{
"name": "5678-PLACE-35",
"OSType": "Windows",
"CompName": "SERVER002",
"RGName": "RG1234",
"SubID": "AD1234567891011",
"SubName": "SUBNAME-Tool"
}
]
}
这是我的模型类:
public class Data
{
public string Name { get; set; }
public string OSType { get; set; }
public string CompName { get; set; }
public string RGName { get; set; }
public string SubID { get; set; }
public string SubName { get; set; }
}
这是我的代码:
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace AzureWinWorkloadList
{
class AzureWinWorkloadList
{
static void Main(string[] args)
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("https://samm-prod-azfun.azurewebsites.net/api/...");
var responseTask = client.GetAsync("");
responseTask.Wait();
var result = responseTask.Result;
if (result.IsSuccessStatusCode)
{
var readTask = result.Content.ReadAsAsync<Data[]>();
readTask.Wait();
var compnames = readTask.Result;
foreach (var CompName in compnames)
{
Console.WriteLine(CompName.CompName);
}
}
}
Console.ReadLine();
}
这是发生错误的行
readTask.Wait();
对此的任何指导将不胜感激!提前致谢!
解决方案
您需要一个包装类来反序列化 JSON 数据。
public class WrapperClass
{
public SkipTokenClass SkipToken { get; set; }
public IEnumerable<Data> Data { get; set; }
}
...
var readTask = result.Content.ReadAsAsync<WrapperClass>();
...
var wrapper = readTask.Result;
用于wrapper.Data
访问数据。
顺便说一句,知道类中的属性与 JSON 数据中的属性不同Name
,请考虑使用JsonPropertyAttribute。Data
name
[JsonProperty("name")]
public string Name { get; set; }
推荐阅读
- angular - ViewChild 的元素引用未定义
- spring-batch - Spring批处理在哪里生成PDF文件,所有已读项目的统计信息
- vba - 将多维数组传递到 VBA 中的记录集变量中
- laravel - 带有 CONCAT 和 DATE_FORMAT 的 Laravel 查询生成器给出错误
- r - 将省略号中的对象名称作为字符串传递给 left_join
- python - python-Cron选项卡中无法识别的星期几错误
- recursion - 面试问题(较大输入的着色网格hackerrank问题)
- python - BeautifulSoup 字符串搜索
- html - 如何删除两个div之间的白线
- mysql - 错误 1045 (28000): 用户 'root'@'localhost' 的访问被拒绝(使用密码:YES);无法重设密码