【问题标题】:C# deserializator doesn't return resultC# 反序列化器不返回结果
【发布时间】:2023-02-06 21:02:33
【问题描述】:

我的反序列化有问题,不知道如何处理。

 var jsonString = @"
            {
              ""Result"": [
                {
                  ""Id"": 994,
                  ""Name"": ""LL Bottom Bracket"",
                },
                {
                  ""Id"": 995,
                  ""Name"": ""ML Bottom Bracket"",
                }
              ]
            }";

HotelRoomDTO 类如下所示:

public class HotelRoomDTO
{

        public int Id { get; set; }
        public string Name { get; set; }

}

服务是

public async Task<IEnumerable<HotelRoomDTO>> GetHotelRooms(string checkInDate, string checkOutDate)
{

    var settings = new JsonSerializerSettings
    {
                NullValueHandling = NullValueHandling.Ignore,
                MissingMemberHandling = MissingMemberHandling.Ignore
    };
    var response = await _client.GetAsync($"api/hotelroom?checkInDate={checkInDate}&  checkOutDate={checkOutDate}");
    var content = await response.Content.ReadAsStringAsync();
    var rooms = JsonConvert.DeserializeObject<IEnumerable<HotelRoomDTO>>(content, settings);
    return rooms;
}

当我尝试运行应用程序反序列化器时崩溃并且不返回结果。我认为问题出在这个“结果”对象列表中。当它不存在时一切正常但是当我从真实数据库获取数据并尝试反序列化它时自动添加这个“结果”并且代码不起作用

【问题讨论】:

  • 你确定它返回IEnumerable&lt;HotelRoomDTO&gt;吗?
  • 崩溃是对错误的非常糟糕的描述。您收到什么异常消息?
  • 假设,额外的引号 "" 只是拼写错误,您的 JSON 字符串描述了一个 object(注意开头和结尾的花括号 {}),但您尝试将其反序列化为 IEnumberable(什么会是一个以 [] 开头和结尾的 JSON 数组)。您需要反序列化为具有 IEnumerable &lt;HotelRoomDTO&gt; Result {get;set;} 属性的类
  • @derpirscher C# 具有逐字字符串文字 @"...",其中字符串中包含的双引号需要用另一个双引号转义,以便 "" 成为实际字符串值中的 "
  • @phuzi 我试试。当再次尝试将强制转换结果序列化为 (IEnumerable<HotelRoomDTO>) 时,因为没有它我再次遇到错误没有序列化程序的响应

标签: c# .net .net-core blazor


【解决方案1】:

您可以尝试创建一个 Root 类:

public class Root
{
    [JsonProperty("Result")]
    public List<HotelRoomDTO> Result { get; set; }

}

并反序列化他:

var rooms = JsonConvert.DeserializeObject<Root>(jsonString, settings);

【讨论】:

    【解决方案2】:

    您的问题是您收到了一份“HotelRoomDTO”列表,但您的模型只适用于一个。

    迭戈的回答在这种情况下会奏效。你想要做的是以下内容。将您的模型文件更改为以下内容:

    public class Result
    {
       public int Id { get; set; }
       public string Name { get; set; }
    }
    
    public class HotelRoomDTO
    {
       public List<Result> Result { get; set; }
    }
    

    在你的GetHotelRooms函数中你现在改变

    var rooms = JsonConvert.DeserializeObject<IEnumerable<HotelRoomDTO>>(content, settings);
    

    var rooms = JsonConvert.DeserializeObject<HotelRoomDTO>(content, settings);
    

    变量 rooms 现在是一个充满 HotelRoomDTO 的列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多