我必须将给定的 JSON 字符串读入 C# 对象。到目前为止一切顺利,但这个案例对我来说有点特别。 JSON 字符串包含 2 个实体。第一个是平面对象,第二个是列表,至少在逻辑上是这样,但实际上在 JSON 中却不是。我希望您能帮助我找到解决方案。
为了更好地解释它,我将向您展示我的 JSON 输入的一部分:
{
"game":{"GameMode":"1","IsNetworkMode":"1","NbMaxPlayer":"12","GameState":"1"},
"player_56":{"PlayerUserId":"137187","PlayerIALevel":"-1","PlayerObserver":"0"},
"player_7":{"PlayerUserId":"3440","PlayerIALevel":"-1","PlayerObserver":"0"}
}
我想将 Player 实体序列化为此类对象的集合。问题是它们并没有真正存储为 JSON 中的集合。它们的动态名称为“player_56”,并且数字不符合任何逻辑顺序,例如“1,2,3”。
目前我正在使用 DataContractJsonSerializer
来完成此任务。
[DataContract]
public class AlbReplay
{
[DataMember(Name = "game")]
public AlbGame Game { get; set; }
[DataMember(Name = "player")]
public List<AlbPlayer> Players { get; set; }
}
有什么建议吗?
最佳答案
我不知道 DataContractJsonSerializer
的范围,但您可能可以在类上实现一个接口(interface)来定义如何解析 JSON。
但是如果您能够使用JSON.Net :
public class Player
{
public int Id { get; set; }
public int PlayerUserId { get; set; }
public int PlayerIALevel { get; set; }
public int PlayerObserver { get; set; }
}
然后您可以使用 Linq-To-JSON:
var data = @"{
""game"":{""GameMode"":""1"",""IsNetworkMode"":""1"",""NbMaxPlayer"":""12"",""GameState"":""1""},
""player_56"":{""PlayerUserId"":""137187"",""PlayerIALevel"":""-1"",""PlayerObserver"":""0""},
""player_7"":{""PlayerUserId"":""3440"",""PlayerIALevel"":""-1"",""PlayerObserver"":""0""}
}";
JObject o = JObject.Parse(data);
IEnumerable<Player> players =
o.Children()
.Where(p => ((JProperty)p).Name.StartsWith("player"))
.Select(p =>
new Player
{
Id = int.Parse(((JProperty)p).Name.Split('_')[1]),
PlayerUserId = int.Parse((string)p.Children<JObject>().First()["PlayerUserId"]),
PlayerIALevel = int.Parse((string)p.Children<JObject>().First()["PlayerIALevel"]),
PlayerObserver = int.Parse((string)p.Children<JObject>().First()["PlayerObserver"]),
});
关于c# - JSON将不同的命名对象反序列化为集合c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17173746/