【问题标题】:Error when i try to deserialise from url in c#当我尝试从 c# 中的 url 反序列化时出错
【发布时间】:2021-09-18 08:37:25
【问题描述】:

我有一种方法可以从 url 反序列化并输出标题让我们说,但我不断收到错误提示

执行请求时发生未处理的异常。 Newtonsoft.Json.JsonSerializationException:无法反序列化 当前 JSON 对象(例如 {"name":"value"})转换为类型 'System.Collections.Generic.List`1[API.Entities.MessageDetail]' 因为该类型需要一个 JSON 数组(例如 [1,2,3])来反序列化 正确。要修复此错误,请将 JSON 更改为 JSON 数组 (例如 [1,2,3])或更改反序列化类型,使其成为正常的 .NET 类型(例如,不是像整数这样的原始类型,也不是集合 可以从 JSON 反序列化的数组或列表等类型 目的。 JsonObjectAttribute 也可以添加到类型中来强制它 从 JSON 对象反序列化。路径“状态”,第 1 行,位置 12。

我的方法是:

WebClient client = new WebClient();

            var json_data = client.DownloadString("https:url-to-json.net");

            var messagesFromUrl = JsonConvert.DeserializeObject<List<MessageDetail>>(json_data);
            
            foreach(var data in messagesFromUrl ) 
            { 
                Console.WriteLine(data.Title);
            }

            return NoContent();

我的模型是:

public class MessageDetail
    {
        public string Title { get; set; }
        public string MessageBody { get; set; }
        public string CreateDate { get; set; }
        public string CreateBy { get; set; }
        public string DeepLinkAction { get; set; }
        public int ImportanceLevel { get; set; }
    }

    public class Content
    {
        public List<MessageDetail> MessageDetails { get; set; }
    }

    public class Root
    {
        public Content Content { get; set; }
    }

Json 数据

{
    "Status": 200,
    "Content": {
        "MessageDetails": [
            {
                "Title": "Emitere Factura",
                "MessageBody": "Factura ANB a fost emisa",
                "CreateDate": "2020-12-03 16:00:00",
                "CreateBy": "System",
                "DeepLinkAction": "Open invoice history scren",
                "ImportanceLevel": 2
            },
            {
                "Title": "Transmitere index",
                "MessageBody": "Sunteti in perioada de autocitire index",
                "CreateDate": "2020-12-03 16:00:00",
                "CreateBy": "System",
                "DeepLinkAction": "Opens the index transmission screen",
                "ImportanceLevel": 2
            },
            {
                "Title": "Analiza Apa",
                "MessageBody": "S-a transmis raportul de analiza apa pe email.",
                "CreateDate": "2020-12-03 16:00:00",
                "CreateBy": "System",
                "DeepLinkAction": "Download invoice",
                "ImportanceLevel": 2
            }
        ]
    }
}

【问题讨论】:

  • 你能提供 JSON 吗?
  • @Ctznkane525 我编辑了帖子

标签: c# json entity-framework .net-core


【解决方案1】:

您需要序列化到根对象,然后访问消息详细信息。

var messagesFromUrl = JsonConvert.DeserializeObject<Root>(json_data).Content.MessageDetails ;
       

【讨论】:

    【解决方案2】:

    您可以使用System.Net.Http HttpClient 类代替WebClientSystem.Text.Json 而不是 Newtonsoft:

    static async Task GetMessagesDetailsAsync() 
        {
            string url = @"https://...";
            HttpClient client = new HttpClient() {BaseAddress = new Uri(url)};
    
            var request = await client.GetAsync(client.BaseAddress);
            if (request.IsSuccessStatusCode) 
            {
                var content = await request.Content.ReadAsStringAsync();
                var messagesList = JsonSerializer.Deserialize<List<MessageDetail>>(content, new JsonSerializerOptions());
                foreach (var message in messagesList)
                {
                    System.Console.WriteLine(message.MessageBody);
                }
            } 
        }
    

    另外,我认为 URL 已损坏。

    【讨论】:

      猜你喜欢
      • 2014-11-23
      • 1970-01-01
      • 2021-09-08
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多