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

Convert deserialized json class to datatable

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

using (var webClient = new System.Net.WebClient())
{
    var downloadTable = webClient.DownloadString(url);
    var myTable = JsonConvert.DeserializeObject<leagueTable>(downloadTable);
    DataTable dt = myTable;
}

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

JSON是嵌套的,class下面是

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

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

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

然后是ways to convert the list to a DataTable。话虽如此,一旦反序列化为自定义列表类型,您还想将其转换为 DataTable 吗?如果 DataTable 用于控件上的数据绑定,则还有其他绑定源选项。

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

var json = JsonConvert.SerializeObject(zone, Formatting.None,
                        new JsonSerializerSettings()
                        {
                            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
                        });

json = "[" + json + "]";

DataTable table = JsonConvert.DeserializeObject<DataTable>(json);