当我尝试从 c# 中的 url 反序列化时出错

Posted

技术标签:

【中文标题】当我尝试从 c# 中的 url 反序列化时出错【英文标题】:Error when i try to deserialise from url in c# 【发布时间】: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 我编辑了帖子 【参考方案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 已损坏。

【讨论】:

以上是关于当我尝试从 c# 中的 url 反序列化时出错的主要内容,如果未能解决你的问题,请参考以下文章

将 xml 反序列化为对象时出错:System.FormatException 输入字符串格式不正确

我注意到当我尝试使用 Borsh 进行序列化/反序列化时会出错

C#反序列化Json字符串

jQuery/ASMX:在 C# 中反序列化 JSON 时出错

C#反序化json字符串,不用区分大小写

使用 Json.Net 进行 C# 枚举反序列化:将值转换为类型时出错