C# 如何将数组中的JSON对象反序列化为列表?

C# How to deserialize JSON objects in an array to a list?

提问人:kkeith1723 提问时间:10/27/2023 最后编辑:Brian Tompsett - 汤莱恩kkeith1723 更新时间:10/27/2023 访问量:40

问:

我是 C# 的新手,并试图检索所有数据并转换为列表,以便我可以使用循环进行进一步处理。下面是 JSON 数据:

[
    {
        "TagNumber": 0001,
        "TagName": "Tag1",
        "TimeStamp": [
            "10/27/2023 14:36:42",
            "10/27/2023 14:37:42",
            "10/27/2023 14:38:42",
            "10/27/2023 14:39:42",
            "10/27/2023 14:40:42",
            "10/27/2023 14:41:42"
        ],
        "Value": [
            0,
            0,
            0,
            0,
            0,
            0
        ],
        "Confidence": [
            100,
            100,
            100,
            100,
            100,
            100
        ],
        "Sequence": [
            0,
            0,
            0,
            0,
            0,
            0
        ]
    }
]

这是我创建的类,我曾经转换过上面的 JSON,但无法使其工作:JsonConvert.DeserializeObject

public class Response
{
    public int TagNumber { get; set; }
    public string? TagName { get; set; }
    public string? Units { get; set; }
    public int Status { get; set; }
    public List<Item>? items { get; set; }
}

public class Item
{
    public DateTime? TimeStampValue { get; set; }
    public int ? Value { get; set; }
    public int? ConfidenceValue { get; set; }
    public int? SequenceValue { get; set; }

}

这是我的代码:

var result = JsonConvert.DeserializeObject<List<Response>>(responceConetent);

为 null,但其他字段可以正确获取数据。item

Result After Running Code

有人可以帮我吗?

C# JSON 反序列化

评论

0赞 Panagiotis Kanavos 10/27/2023
列表没有什么特别之处。如果得到 null 字段,那是因为数据丢失或映射失败
0赞 Eldar 10/27/2023
好吧,json 有 4 个数组,但你有 1 个数组和 4 个属性,你不能像这样序列化它。但是在将其序列化为适当的模型后,您可以根据需要对其进行转换。
0赞 Panagiotis Kanavos 10/27/2023
顺便说一句,你的字符串中没有日期。在 JSON 中,日期应采用 ISO-8601 格式。这些本地化的字符串在世界上除一个国家/地区以外的所有国家/地区都无法解析
0赞 Panagiotis Kanavos 10/27/2023
JSON 中没有属性。根本没有对象数组,还有其他原始值数组。itemsItem
0赞 JonasH 10/27/2023
您的 Json-object 似乎使用“数组结构”模式,而不是您似乎期望的“结构数组”模式。您可以在模式之间进行转换,但需要自己进行转换,序列化库不会这样做。

答:

3赞 David 10/27/2023 #1

您拥有的类与 JSON 中的对象不匹配。它需要匹配,除非你正在编写自定义反序列化程序。

更新类结构以匹配该 JSON:

public class Response
{
    public int TagNumber { get; set; }
    public string? TagName { get; set; }
    public List<DateTime> TimeStamp { get; set; }
    public List<int> Value { get; set; }
    public List<int> Confidence { get; set; }
    public List<int> Sequence { get; set; }
}

请注意,我并不完全相信这些值会反序列化。这可能取决于文化设置。在最坏的情况下,它们可能是字符串:DateTime

public class Response
{
    public int TagNumber { get; set; }
    public string? TagName { get; set; }
    public List<string> TimeStamp { get; set; }
    public List<int> Value { get; set; }
    public List<int> Confidence { get; set; }
    public List<int> Sequence { get; set; }
}

然后,您可以将 转换为另一个模型结构中的 a,以便在代码中使用,从而使整个“反序列化”更像是一个两步过程。除非有一种简单的方法可以让反序列化程序处理这些时间戳的格式。这是一个单独的问题,您可能需要调查,但最坏的情况是,它只是一个两步过程。List<string>List<DateTime>