我有一个DataTable
,它只有一行,看起来像
America | Africa | Japan |
-------------------------------------------------------------
{"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}}
DataTable
列是美洲、非洲、日本。
现在我想将DataTable
转换为JSON,这样JSON看起来就像
{
"America": {
"Id": 1,
"Title": "Ka"
},
"Africa": {
"Id": 2,
"Title": "Sf"
},
"Japan": {
"Id": 3,
"Title": "Ja",
"Values": {
"ValID": 4,
"Type": "Okinawa"
}
}
}
我的尝试是:
string js = JSonConvverter.Serializeobject(datatable);
var objType = JObject.Parse(js);
但没成功任何帮助都将不胜感激。
4条答案
按热度按时间vmdwslir1#
假设您使用的是json.net,有一个特殊的内置转换器
DataTableConverter
,它将abbreviated format中的数据表输出为一个行数组,其中每行序列化为列名/值对,如您的问题所示。DataRow
没有特定的内置转换器。因此,当直接序列化DataRow
时,Json.NET将序列化DataRow
的所有字段和属性,从而导致更详细的输出-而你不想这样以
DataTable
使用的更紧凑的形式序列化DataRow
的最直接的方法是使用JArray.FromObject()
将整个表序列化为JArray
,然后选择与要序列化的DataRow
具有相同索引的数组项:因为你的表只有一行,所以
rowIndex
应该是0
。更一般地说,如果你不知道给定DataRow
的索引,请参阅 * How to get the row number from a datatable? *。这对于只有一行的表应该很好,但通常不会有很好的性能。
演示小提琴#1 here。
或者,如果表的行多列少,可以使用LINQ将行转换为
Dictionary<string, object>
,然后序列化:只要列数不多,性能应该不会太差。
小提琴#2 here。
序列化一行最高效的方式是为
DataRow
引入一个customJsonConverter
,将行作为对象写入JSON:然后像这样使用它:
备注:
DataRow
是有意义的,但是反序列化一个DataRow
是没有意义的,因为DataRow
不是一个独立的对象;它只存在于某个父DataTable
中。因此ReadJson()
没有实现。JsonConverter<T>
在Json.NET 11.0.1中引入。在早期版本中继承自JsonConverter
。演示小提琴#3 here。
yfjy0ee72#
作为找到here的答案的替代方案,您可以使用
ExpandoObject
快速且非常容易地将单行呈现为JSON,如下所示:mfpqipee3#
拼写?对“SerializeObject”方法的调用不应该是:
另请参阅有关转换datatable to JSON string的类似问题。
vs3odd8k4#
就像Gazzi说的,你应该包括NewtonSoft.Json库,它包含在Visual Studio中。
要获得类似于您所描述的对象,您应该创建一个类似Country.cs的数据模型,如下所示。
创建一个helper函数来将表数据转换为这些模型。然后您可以使用Newtonsoft库根据需要序列化/反序列化数据。