使用 JavaScriptSerializer 反序列化 json 字符串

Deserialize json string using JavaScriptSerializer

我正在使用 C# 中的 JavaScriptSerializer 反序列化 json 字符串,并尝试解析 json 字符串并将其映射到 sql 服务器中的适当列 table 用于插入数据。我有如下示例 json 字符串。

JSON

{
    "event": [
        [
            {
                "Id": 456895,
                "Name": "Chelsea - Arsenal",
                "BetOffers": [
                    {
                        "BetType": "Game",
                        "Picks": [
                            {
                                "Pick": "1",
                                "Odds": 1.15
                            },
                            {
                                "Pick": "x",
                                "Odds": 1.46
                            },
                            {
                                "Pick": "2",
                                "Odds": 1.15
                            }
                        ]
                    }
                ]
            }
        ],
        [
            {
                "Id": 456879,
                "Name": "Liverpool - Manchester United",
                "BetOffers": [
                    {
                        "BetType": "Game",
                        "Picks": [
                            {
                                "Pick": "1",
                                "Odds": 1.20
                            },
                            {
                                "Pick": "x",
                                "Odds": 1.42
                            },
                            {
                                "Pick": "2",
                                "Odds": 1.85
                            }
                        ]
                    }
                ]
            }
        ]
    ]
}

基于 json 输出字符串,我正在用 C# 编写我的 class,如下所示。

public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BetOffer> BetOffers { get; set; }
}

public class BetOffer
{
    public string BetType { get; set; }
    public List<BetPick> Picks { get; set; }
}

public class BetPick
{
    public string Pick { get; set; }
    public double Odds { get; set; }
}

public class MyRootObject
{
    public List<List<BetPick>> @event { get; set; }
}
    
var root = new JavaScriptSerializer().Deserialize<MyRootObject>(jsonString);

如下所示将数据插入 table。

string connectionString = "Database ConnectionString";

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ID", typeof(string)));
dt.Columns.Add(new DataColumn("Name", typeof(string)));
dt.Columns.Add(new DataColumn("BetType", typeof(string)));
dt.Columns.Add(new DataColumn("Pick", typeof(string)));
dt.Columns.Add(new DataColumn("Odds", typeof(string)));
DataRow dr = dt.NewRow();

for (var i = 0; i < root.event.Count; i++)
{
    dr = dt.NewRow();
    dr["ID"] = root.event[i].Id;//stuck at table to json string parse and map
    dt.Rows.Add(dr);
}

问题

我无法理解如何解析 json 字符串并将数据映射到 table 中的适当列,以便将数据插入 sql table。无法从 json 字符串中找到 root.event.Id?

错误

列表不包含 Id 的定义

@event 属性 必须是 List<List<Event>>.

类型
public class MyRootObject
{
    public List<List<Event>> @event { get; set; }
}
public class Event
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<BetOffer> BetOffers { get; set; }
}
public class BetOffer
{
    public string BetType { get; set; }
    public List<BetPick> Picks { get; set; }
}
public class BetPick
{
    public string Pick { get; set; }
    public double Odds { get; set; }
}

让我们遍历这个结构。既然你用了for循环,我也做了for循环的代码(当然这个代码可以大大简化)

for (int i = 0; i < root.@event.Count; i++)
{
    for (int j = 0; j < root.@event[i].Count; j++)
    {
        Console.WriteLine("Id: " + root.@event[i][j].Id);
        Console.WriteLine("Name: " + root.@event[i][j].Name);

        for (int k = 0; k < root.@event[i][j].BetOffers.Count; k++)
        {
            Console.WriteLine("BetType: " + root.@event[i][j].BetOffers[k].BetType);

            for (int l = 0; l < root.@event[i][j].BetOffers[k].Picks.Count; l++)
            {
                Console.WriteLine(root.@event[i][j].BetOffers[k].Picks[l].Pick +
                    "  " + root.@event[i][j].BetOffers[k].Picks[l].Odds);
            }
        }
        Console.WriteLine();
    }
}

如您所见,有 四个 嵌套循环。一个DataTable是一个方阵,可以两次循环遍历

你的json代表的数据结构不扁平。因此,它不能表示为单个 DataTable.