gpt4 book ai didi

c# - JSON反序列化不同的命名对象到集合c#

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:30 24 4
gpt4 key购买 nike

我必须将给定的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com