【问题标题】:Deserialize json string using JavaScriptSerializer使用 JavaScriptSerializer 反序列化 json 字符串
【发布时间】:2020-11-20 06:04:01
【问题描述】:

我正在使用 C# 中的 JavaScriptSerializer 反序列化 json 字符串,并尝试解析 json 字符串并将其映射到 sql server 表中的适当列以插入数据。我有如下示例 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# 编写我的类,如下所示。

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);

如下向表中插入数据。

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 字符串并将数据映射到表中的适当列,以便将数据插入到 sql 表中。无法从 json 字符串中找到 root.event.Id?

错误

列表不包含 Id 的定义

【问题讨论】:

  • 为什么我们又使用JavaScriptSerializer?虽然可能不是这里的问题。我建议使用 Json.Net 或 Text.Json
  • @TheGeneral,我有使用 Newtonsoft Json 的限制。
  • 我建议澄清这个问题。标题特别说明了反序列化,但问题中有数据库内容。那么什么是工作,需要成为问题。
  • 即使使用 JavaScript 阅读它并将其保存为您喜欢的格式也可能会更容易......获得关于这样一段旧代码的免费建议可能很难......
  • @ErikPhilips,当我尝试从 json 字符串解析 Id (root.event.Id) 时,我得到错误列表不包含 Id 的定义。

标签: c# json javascriptserializer


【解决方案1】:

@event 属性必须是 List&lt;List&lt;Event&gt;&gt; 类型。

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

【讨论】:

  • 嗨亚历山大·彼得罗夫。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2019-02-28
相关资源
最近更新 更多