我有一个数据表whis只有一行,看起来像
America | Africa | Japan |
-------------------------------------------------------------
{"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}}
数据列是美国,非洲,日本
现在我想将数据表转换为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);
但它没有用.
任何帮助将不胜感激.谢谢!
解决方法
Json.NET有一个特殊的内置转换器
DataTableConverter,它以缩写格式输出数据表.虽然它也有
one for DataSet,但它没有
DataRow的特定内置转换器.因此,在序列化DaTarow时,它将序列化DaTarow的所有字段和属性,从而产生更详细的输出.
如果要以DataTable使用的更紧凑的形式序列化DaTarow,最简单的方法是使用JArray.FromObject()将整个表序列化为JArray,然后选择第一个元素,如下所示:
var datatable = MakeTable();
var objType = JArray.FromObject(datatable,JsonSerializer.CreateDefault(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).FirstOrDefault(); // Get the first row
var js = objType.ToString();
Debug.WriteLine(js); // Outputs abbreviated JSON as desired.
哪个输出:
06001
完整示例:
public class Values
{
public int ValID { get; set; }
public string Type { get; set; }
}
public class Place
{
public int Id { get; set; }
public string Title { get; set; }
public Values Values { get; set; }
}
public class TestClass
{
static DataTable MakeTable()
{
var table = new DataTable();
table.Columns.Add("America",typeof(Place));
table.Columns.Add("Africa",typeof(Place));
table.Columns.Add("Japan",typeof(Place));
DaTarow row = table.NewRow();
row["America"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":1,""Title"":""Ka""}");
row["Africa"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":2,""Title"":""Sf""}");
row["Japan"] = JsonConvert.DeserializeObject<Place>(@"{""Id"":3,""Title"":""Ja"",""Values"":{""ValID"":4,""Type"":""Okinawa""}}");
table.Rows.Add(row);
return table;
}
public static void test()
{
var datatable = MakeTable();
var objType = JArray.FromObject(datatable,JsonSerializer.CreateDefault(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore })).FirstOrDefault(); // Get the first row
var js = objType.ToString();
Debug.WriteLine(js); // Outputs abbreviated JSON as desired.
}
}