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

标签 c# json collections deserialization

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

相关文章:

c# - 列表框控件中的多列

c# - 如何在 C# 中为图像设置动画

java - 如何直接从 JsonGenerator 构建 JsonNodes 树

javascript - 当值为数字时,JSON 返回未定义错误

java - Java 中是否有有向无环图 (DAG) 数据类型,我应该使用它吗?

c# - Linq OrderBy 特定值不在分组内排序

java - 尝试读取 json Assets 时出现 FileNotFoundException

Java:Set接口(interface)和Collection接口(interface)的区别

java - 为什么 Iterator 或 listIterator 的 hasext、hasprevious 等方法不检查 ConcurrentModificationException

c# - MailItem.GetInspector.WordEditor 在 Outlook 2013 AddIn 上始终为 NULL