过滤JSon信息

本文关键字:信息 JSon 过滤 | 更新日期: 2023-09-27 18:09:40

我正在接收不同形式的JSON数据(不是所有的JSON文件,我将收到将有相同的条目)

通常解析JSon我使用动态类,这是工作的,如果所有的JSon文件有相同的条目,但它不是在这种情况下工作。

例如下面的Data:

[
    {
        "Player_Name": "Zlatan Ibrahimovic",
        "Country": "Sweeden",
    },
    {
        "Player_Name": "Pavel Nedved",
        "Country": "Czech Republic",
        "Personal_Honours": 
        {
            "Ballon_DOr": "One",
        },
    }
]

前两个元素共享前两个条目"Player_Name"answers"Country",但第二个元素有第二个条目" personal_honors "

所以如果我这样做:

StreamReader reader = File.OpenText("TextFile1.txt");
List<PlayerData> DataList;
dynamic json = JsonConvert
    .DeserializeObject<dynamic>(reader.ReadToEnd());

DataList = new List<PlayerData>();
foreach (dynamic data in json)
{
    DataList.Add(new PlayerData
    {
        Name = json.Player_Name,
        Country = json.Country , 
        BallonDor = json.Personal_Honours.Ballon_DOr
    });
}

与这个类:

public class PlayerData
{
    public string Name { get; set; }
    public string BallonDor {get; set; }
    public string MarketValue { get; set; }
    public string CurrentClub { get; set; }
}

我得到一个RuntimeBinderException,因为第一个条目不包含personal_honors"我不会提前知道JSON将解析将包含此条目

如何处理这个错误?

过滤JSon信息

如果你不想为JSON对象使用具体的类,你可以使用匿名类的强大功能:只需定义使用所有可能属性的示例对象,像这样:

        var sample = new[]
        {
            new
            {
                Player_Name = "",
                Country = "",
                Personal_Honours = new
                {
                    Ballon_DOr = "",
                },
            }
        };

并使用其.GetType()传递给JSON反序列化器,如下所示:

        dynamic json = JsonConvert.DeserializeObject(myJsonString, sample.GetType());

这是基于你的资源的完整工作示例:

internal class Program
{
    public class PlayerData
    {
        public string Name { get; set; }
        public string BallonDor { get; set; }
        public string Country { get; set; }
        public string MarketValue { get; set; }
        public string CurrentClub { get; set; }
    }
    private static void Main(string[] args)
    {
        var sample = new[]
        {
            new
            {
                Player_Name = "",
                Country = "",
                Personal_Honours = new
                {
                    Ballon_DOr = "",
                },
            }
        };
        dynamic json = JsonConvert.DeserializeObject(@"[
{
  ""Player_Name"": ""Zlatan Ibrahimovic"",
  ""Country"": ""Sweeden"",
},
{
""Player_Name"": ""Pavel Nedved"",
 ""Country"": ""Czech Republic"",
  ""Personal_Honours"": {
  ""Ballon_DOr"": ""One"",
},
}
]", sample.GetType());
        var dataList = new List<PlayerData>();
        foreach (var data in json)
        {
            dataList.Add(
                new PlayerData
                {
                    Name = data.Player_Name,
                    Country = data.Country,
                    BallonDor = data.Personal_Honours == null ? null : data.Personal_Honours.Ballon_DOr
                });
        }
    }
}

你把东西混在一起了

反写程序不知道也不关心你想如何保存你的数据。它只获取要反序列化的字符串和对象类型来创建具有反序列化数据的实例。

你把第一类和第二类混在一起了。

例如,我将其划分如下:

Player class:
- Name (string)
- Country (string)
- PersonalHonours (class)
PersonalHonours class
- BallonDOr (string)
- etc..

当然,在命名不同的情况下,在许多地方'_'是不同的,你应该"告诉"反序列化器,这些实际上绑定到另一个键,通过添加属性[JsonProperty("Ballon_DOr")]属性。

在所有这些之后,你所需要做的就是对整个字符串使用你的反序列化器,它会生成一个可供使用的字符串