首页 > 解决方案 > 在 .NET Core 3.1 中使用 System.Text.Json 进行反序列化会导致 null 属性值

问题描述

我有以下json:

{
 "GameConfig":{
  "TeamConstraint":{
     "SameTeamPlayers":[
        "Raghav",
        "Surya"
     ],
     "OppositeTeamPlayers":[
        "Wolfman",
        "Pawan"
     ]
  },
  "Players":[
     "Tramp",
     "Surya",
     "Raghav",
     "Krishna",
     "Sanjay",
     "Bala",
     "Wolfman",
     "Eagle",
     "Sai",
     "Pawan",
     "Joo",
     "Srikanth"
  ],
  "Ranks":{
     "Tramp":10,
     "Surya":10,
     "Raghav":8,
     "Krishna":8,
     "Eagle":8,
     "Sai":8,
     "Sanjay":7.5,
     "Pawan":5,
     "Wolfman":5.0,
     "Srikanth":6,
     "Bala":4.5,
     "Joo":1.5
   }
  }
}

我正在编写一个简单的控制台应用程序 .NET Core 3.1。我已经尝试过 JSON.NET 以及新的 MSFT System.Text.Json 反序列化器。但是对于以下 Model 对象,我只获得所有属性的空值。

[Serializable]
public class GameConfig
{
    public TeamConstraint TeamConstraint { get; set; }
    
    public List<string> Players { get; set; }
    
    public Dictionary<string, double> Ranks { get; set; }
}

[Serializable]
public class TeamConstraint
{
    public List<string> OppositeTeamPlayers { get; set; }

    public List<string> SameTeamPlayers { get; set; }
}

我已经尝试了几个额外的选项,比如使用带有 CamelCase 属性的合同解析器并相应地更改代码和 json,但到目前为止没有任何效果。我错过了什么?

这是我用来反序列化的代码。

var jsonString = File.ReadAllText(TeamGeneratorStandardSettings.Default.GameConfigFile);
var gameConfig = JsonSerializer.Deserialize<GameConfig>(jsonString);

标签: c#json.netsystem.text.json

解决方案


您正在尝试反序列化为GameConfig,而这只是整个 json 对象结构的顶级属性。您需要一个新的顶级类型来反序列化为包含您的GameConfig对象的类型。

public class GameData
{
    public GameConfig GameConfig { get; set; } 
}

var jsonString = File.ReadAllText(TeamGeneratorStandardSettings.Default.GameConfigFile);
var gameConfig = JsonSerializer.Deserialize<GameData>(jsonString);

或者,您可以从 json 中删除包装对象,并且仍然直接反序列化为GameConfig对象:

{
  "TeamConstraint":{
     "SameTeamPlayers":[
        "Raghav",
        "Surya"
     ],
     "OppositeTeamPlayers":[
        "Wolfman",
        "Pawan"
     ]
  },
  "Players":[
     "Tramp",
     "Surya",
     "Raghav",
     "Krishna",
     "Sanjay",
     "Bala",
     "Wolfman",
     "Eagle",
     "Sai",
     "Pawan",
     "Joo",
     "Srikanth"
  ],
  "Ranks":{
     "Tramp":10,
     "Surya":10,
     "Raghav":8,
     "Krishna":8,
     "Eagle":8,
     "Sai":8,
     "Sanjay":7.5,
     "Pawan":5,
     "Wolfman":5.0,
     "Srikanth":6,
     "Bala":4.5,
     "Joo":1.5
   }
  }
var jsonString = File.ReadAllText(TeamGeneratorStandardSettings.Default.GameConfigFile);
var gameConfig = JsonSerializer.Deserialize<GameConfig>(jsonString);

推荐阅读