首页 > 解决方案 > 如何从 JSON 文件反序列化 .NET Core 中封装的对象表?

问题描述

我想从外部 api 检索足球联赛的集合。来自服务器的响应如下所示:

{
"api": {
    "results": 1496,
    "leagues": [
        {
            "league_id": 1,
            .....

返回的对象由一个包含“结果”和“联盟”的“api”字段组成。我想反序列化代码并将其映射到我的代码中的 League 类对象。

var jsonString = await ExecuteUrlAsync(filePath, url);

var results = JsonConvert.DeserializeObject<IEnumerable<LeagueEntity>>(jsonString);

jsonString 是正确的,但是当程序运行到第二行时,我得到一个异常:

Cannot deserialize the current JSON object (e.g. {\"name\":\"value\"}) into type 'System.Collections.Generic.IEnumerable".

我需要进入 JSON 文件中的“联盟”字段,并忽略其余的响应。如何做到这一点?

标签: c#json.net-core

解决方案


假设您LeagueEntity对应于api.leagues[*]对象,您可以使用它JsonConvert.DeserializeAnonymousType()来挑选和反序列化 JSON 的有趣部分:

var leagues = JsonConvert.DeserializeAnonymousType(jsonString, 
                                                   new { api = new { leagues = default(List<LeagueEntity>) } })
    ?.api?.leagues;

api.leagues这避免了为容器对象创建显式数据模型的需要。它也应该比预加载到JToken层次结构中更有效,然后作为第二步选择和反序列化api.leagues数组。

演示小提琴在这里

(或者,您可以使用How to auto-generate a C# class file from a JSON string中的答案之一为整个 JSON 自动生成完整的数据模型。)


推荐阅读