C#重命名JSON动态属性名称

时间:2019-12-12 12:23:37

标签: c# json deserialization json-deserialization

我从json格式的服务器上获取匹配数据。在这个json中,有两个属性(键),它们的名称是可变的和动态的,并取决于灯具。 例如,我获得了fix_id 256的匹配数据

{
  "api": {
    "results": 1,
    "fixtures": [
      {
        "fixture_id": 256,
        "league_id": 21,
        "homeTeam": {
          "team_id": 12,
          "team_name": "Tottenham"
        },
        "awayTeam": {
          "team_id": 13,
          "team_name": "Everton"
        },
        "lineups": {
          "Tottenham": {
            "coach": "qqqq",
            "formation": "4-2-3-1"
          },
          "Everton": {
            "coach": "rrrr",
            "formation": "4-2-3-1"
          }
        }
      }
    ]
  }
}

此json的类

public class rootMatch
{
    [JsonProperty("api")]
    public Api Api { get; set; }
}

public class Api
{
    [JsonProperty("results")]
    public long Results { get; set; }

    [JsonProperty("fixtures")]
    public List<Fixture> Fixtures { get; set; }
}

public partial class Fixture
{
    [JsonProperty("fixture_id")]
    public long FixtureId { get; set; }

    [JsonProperty("league_id")]
    public long LeagueId { get; set; }

    [JsonProperty("homeTeam")]
    public Team HomeTeam { get; set; }

    [JsonProperty("awayTeam")]
    public Team AwayTeam { get; set; }

    [JsonProperty("lineups")]
    public Lineups Lineups { get; set; }
}
public class Lineups
{
    [JsonProperty("Tottenham")]
    public Team Tottenham{ get; set; }

    [JsonProperty("Everton")]
    public Team Everton{ get; set; }
}
public class Team
{
    [JsonProperty("coach")]
    public string Coach { get; set; }

    [JsonProperty("formation")]
    public string Formation { get; set; }
}

但是,rootMatch类仅适用于此json。
有没有办法在反序列化期间更改Data属性的名称,将其更改为静态名称?

阵容中的第一个TeamName->更改为HomeTeam

阵容中的第二个TeamName->更改为AwayTeam

例如,在此json“阵容”

(热刺转换-> HomeTeam)
和 (Everton转换-> AwayTeam)

2 个答案:

答案 0 :(得分:1)

“有问题的” JSON是具有两个属性的对象,其中属性名称是团队名称。这些是事先未知的。为此,您可以使用字符串键将类型更改为字典。

要创建有意义的名称,我对您的类型进行了一些调整:

这是团队:

public class Team
{
    [JsonProperty("team_id")]
    public int TeamId { get; set; }

    [JsonProperty("team_name")]
    public string TeamName { get; set; }
}

这是一个阵容:

public class Lineup
{
    [JsonProperty("coach")]
    public string Coach { get; set; }

    [JsonProperty("formation")]
    public string Formation { get; set; }
}

然后灯具变为:

public partial class Fixture
{
    [JsonProperty("fixture_id")]
    public long FixtureId { get; set; }

    [JsonProperty("league_id")]
    public long LeagueId { get; set; }

    [JsonProperty("homeTeam")]
    public Team HomeTeam { get; set; }

    [JsonProperty("awayTeam")]
    public Team AwayTeam { get; set; }

    [JsonProperty("lineups")]
    public Dictionary<string, Lineup> Lineups { get; set; }
}

注意如何在C#中将lineups JSON属性映射到Dictionary<string, Lineup>

在这里,您可以获取主队和客队的阵容:

var root = JsonConvert.DeserializeObject<rootMatch>(json);
var fixture = root.Api.Fixtures.First();
var homeTeamLineup = fixture.Lineups[fixture.HomeTeam.TeamName];
var awayTeamLineup = fixture.Lineups[fixture.AwayTeam.TeamName];

团队名称在字典中用作键。

我使用First来选择第一个灯具。您可能会使用LINQ或循环来处理所有灯具。

答案 1 :(得分:1)

您可以添加属性

[JsonExtensionData]
public Dictionary<string, object> AdditionalData { get; set; }

这将包含所有不匹配的属性。然后,您可以遍历字典并根据需要处理这些数据。