当我尝试从 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
类代替WebClient
和 System.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 进行序列化/反序列化时会出错