我有一个数据表whis只有一行,看起来像
America | Africa | Japan |
-------------------------------------------------------------
{"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}}
datatble列是美国,非洲,日本
现在我想将数据表转换为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);
但它没有用。
任何帮助都将不胜感激。谢谢!
答案 0 :(得分:12)
Json.NET有一个特殊的内置转换器DataTableConverter
,它以缩略格式输出数据表。虽然它也有one for DataSet
,但它没有针对DataRow
的特定内置转换器。因此,在序列化DataRow
时,它将序列化DataRow
的所有字段和属性,从而产生更详细的输出。
如果要在DataRow
使用的更紧凑的表单中序列化DataTable
,最简单的方法是使用{{3将整个表序列化为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.
哪个输出:
{ "America": { "Id": 1, "Title": "Ka" }, "Africa": { "Id": 2, "Title": "Sf" }, "Japan": { "Id": 3, "Title": "Ja", "Values": { "ValID": 4, "Type": "Okinawa" } }
完整示例:
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.
}
}
答案 1 :(得分:2)
拼写?你不应该调用“SerializeObject”方法:
string js = JsonConvert.SerializeObject(datatable);
另请参阅有关转换datatable to JSON string的类似问题。
答案 2 :(得分:2)
像Gazzi一样,你应该包含它包含在Visual Studio中的NewtonSoft.Json库。
要获得与您所描述的类似的对象,您应该创建一个像Country.cs这样的数据模型。
[Serializable]
public class CountryModel {
public int ID { get; set; }
public string Title { get; set; }
public List<ValueModel> Values { get; set; }
}
[Serializable]
public class ValueModel {
public int ValueID { get; set; }
public string Type { get; set; }
}
创建一个帮助函数,将表数据转换为这些模型。然后,您可以根据需要使用Newtonsoft库序列化/反序列化数据。
答案 3 :(得分:1)
作为找到答案here的替代方法,您可以使用ExpandoObject
快速,轻松地将单行呈现为JSON,例如:
var expando = new System.Dynamic.ExpandoObject() as IDictionary<string, object>;
foreach (DataColumn col in myRow.Table.Columns)
{
eo[col.ColumnName] = myRow[col];
}
var json = JsonConvert.SerializeObject(expando);