将反序列化的 json 类转换为数据表

本文关键字:转换 数据表 json 反序列化 | 更新日期: 2023-09-27 18:36:41

我正在尝试使用以下代码将我反序列化为类的 json 转换为数据表,但是下面的代码在最后一行失败。

using (var webClient = new System.Net.WebClient())
{
    var downloadTable = webClient.DownloadString(url);
    var myTable = JsonConvert.DeserializeObject<leagueTable>(downloadTable);
    DataTable dt = myTable;
}
我知道我可以直接反序列化为数据

表,但我想先将其反序列化为类,以便我可以操作数据并让使用该代码的其他人知道数据的结构。

JSON是嵌套的,为其创建的类如下

public class leagueTable
{
    public string leaguename { get; set; }
    public int gameday { get; set; }
    public System.Collections.ObjectModel.Collection<Ranking> ranking { get; set; }
}
public class Ranking
{
    public int rank { get; set; }
    public string club { get; set; }
    public int games { get; set; }
    public int points { get; set; }
}

将反序列化的 json 类转换为数据表

要使 json 字符串反序列化为 DataTable,它需要是一个 json 对象的数组,其中数组中的每个一级对象对应于一行。例如,这将正常工作:

string data = "[{'"FirstName'": '"John'", '"LastName'": '"Smith'"}, {'"FirstName'": '"Mohammed'", '"LastName'": '"Lee'"}]"; 
var dt = JsonConvert.DeserializeObject<DataTable>(data);

请注意,整个 json 字符串都在 [] 内。即使它是仅包含数组的 json 对象,它也不会起作用。

如果你想先反序列化为自定义类型,那么我建议你将完全相同的 json 反序列化为List<T>而不是 DataTable。

class Name 
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}
...
var names = JsonConvert.DeserializeObject<List<Name>>(data);

然后有一些方法可以将列表转换为数据表。话虽如此,一旦反序列化为自定义列表类型,是否仍希望将其转换为 DataTable?如果要将 DataTable 用于控件上的数据绑定,则还有其他用于绑定源的选项。

您是否尝试过让您的类继承自 DataTable 类?理想情况下,您将能够操作数据,并使最终结果仍然是数据表。

如果只序列化了一个对象,则将要解析的方括号正确添加到数据表中。

var json = JsonConvert.SerializeObject(zone, Formatting.None,
                        new JsonSerializerSettings()
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        });
json = "[" + json + "]";
DataTable table = JsonConvert.DeserializeObject<DataTable>(json);