【问题标题】:How to deserialize JSON list to C# List of objects如何将 JSON 列表反序列化为 C# 对象列表
【发布时间】:2022-01-19 12:01:42
【问题描述】:

从 AWS lambda 我得到这个 JSON 字符串:

[{"Id":19162,"LotId":21243,"LotNumber":"H6469","LotType":20,"ConfirmationStatus":0,"Date":"2016-02-17T10:51:06.757"},{"Id":19163,"LotId":21244,"LotNumber":"H6469a","LotType":20,"ConfirmationStatus":0,"Date":"2016-02-17T10:51:19.933"}]

我已经声明了一个类,我想反序列化从这个 API 接收到的数据。

public class GetWesLotToGenerateReturn
    {
        public long Id { get; set; }
        public long LotId { get; set; }
        public string LotNumber { get; set; }
        public int LotType { get; set; }
        public int ConfirmationStatus { get; set; }
        public DateTime Date { get; set; }
    }

我正在尝试这样做:

List<GetWesLotToGenerateReturn> sample = JsonSerializer.Deserialize<List<GetWesLotToGenerateReturn>>(lots);

我收到此错误:

The JSON value could not be converted to System.Collections.Generic.List`1[Service.App.Models.AdaptersModels.GetWesLotToGenerateReturn]. Path: $ | LineNumber: 0 | BytePositionInLine: 268.

如何正确地将 JSON 从列表反序列化为 C# 中的对象列表?

提前致谢!

【问题讨论】:

  • 您给出的示例字符串只有 235 个字符,所以我怀疑这不是您实际反序列化的字符串。
  • (还不清楚您使用的是哪个框架 - 是 System.Text.Json.JsonSerializer 还是 Newtonsoft.Json.JsonSerializerminimal reproducible example 真的会有所帮助...)
  • 我正在使用System.Text.Json.JsonSerializer
  • @JonSkeet 这个 JSON 字符串实际上是:"\"[{\\\"Id\\\":19162,\\\"LotId\\\":21243,\\\"LotNumber\\\":\\\"H6469\\\",\\\"LotType\\\":20,\\\"ConfirmationStatus\\\":0,\\\"Date\\\":\\\"2016-02-17T10:51:06.757\\\"},{\\\"Id\\\":19163,\\\"LotId\\\":21244,\\\"LotNumber\\\":\\\"H6469a\\\",\\\"LotType\\\":20,\\\"ConfirmationStatus\\\":0,\\\"Date\\\":\\\"2016-02-17T10:51:19.933\\\"}]\"" 我只是想以更易读的格式显示它
  • 如果 JSON 字符串实际上包含任何反斜杠,我会感到非常惊讶。我强烈怀疑这只是调试器执行转义。如果您可以按照我之前的要求提供minimal reproducible example,我们可以为您提供帮助……但在那之前,我怀疑任何人都可以做。

标签: c# json jsonserializer


【解决方案1】:

你的 json

json= "\"[{\\\"Id\\\":19162,\\\"LotId\\\":21243,\\\"LotNumber\\\":\\\"H6469\\\",\\\"LotType\\\":20,\\\"ConfirmationStatus\\\":0,\\\"Date\\\":\\\"2016-02-17T10:51:06.757\\\"},{\\\"Id\\\":19163,\\\"LotId\\\":21244,\\\"LotNumber\\\":\\\"H6469a\\\",\\\"LotType\\\":20,\\\"ConfirmationStatus\\\":0,\\\"Date\\\":\\\"2016-02-17T10:51:19.933\\\"}]\"";

你的 json 被序列化了两次(可能是使用 JSON.stringify),首先需要修复

json=JsonConvert.DeserializeObject<string>(json);

在此之后,我使用序列化程序(MS 和 Newtonsoft)对其进行反序列化,一切正常

var jd = JsonConvert.DeserializeObject<List<GetWesLotToGenerateReturn>>(json);

var jdm = System.Text.Json.JsonSerializer.Deserialize<List<GetWesLotToGenerateReturn>>(json);

【讨论】:

  • 非常感谢!我实际上并没有意识到我在发送它之前和我的端点中序列化了 lambda 中的对象。我刚刚删除了 lambda 中的序列化,它开始工作了! :)
  • @MateoSkyline:请注意,如果您从一开始就包含minimal reproducible example,这将很容易解决。问题中的第一个陈述是不正确的 - 因为您没有获得您声称获得的 JSON。请帮助我们将来为您提供帮助。
猜你喜欢
  • 2017-06-10
  • 2016-05-30
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
相关资源
最近更新 更多