首页 > 解决方案 > 控制台应用无法反序列化 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();

对此的任何指导将不胜感激!提前致谢!

标签: c#jsonconsolehttpclient

解决方案


您需要一个包装类来反序列化 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,请考虑使用JsonPropertyAttributeDataname

[JsonProperty("name")]
public string Name { get; set; }

推荐阅读