使用 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
.
我正在使用 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
.