将反序列化的 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 字符串反序列化为 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);