Sci*_*y13 9 .net c# datatable json
我有一个数据表whis只有一行,看起来像
America | Africa | Japan |
-------------------------------------------------------------
{"Id":1,"Title":"Ka"} | {"Id":2,"Title":"Sf"} | {"Id":3,"Title":"Ja","Values":{"ValID":4,"Type":"Okinawa"}}
Run Code Online (Sandbox Code Playgroud)
数据列是美国,非洲,日本
现在我想将数据表转换为JSon,使json看起来像
{
"America": {
"Id": 1,
"Title": "Ka"
},
"Africa": {
"Id": 2,
"Title": "Sf"
},
"Japan": {
"Id": 3,
"Title": "Ja",
"Values": {
"ValID": 4,
"Type": "Okinawa"
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的尝试是,
string js = JSonConvverter.Serializeobject(datatable);
var objType = JObject.Parse(js);
Run Code Online (Sandbox Code Playgroud)
但它没有用.
任何帮助将不胜感激.谢谢!
dbc*_*dbc 14
Json.NET有一个特殊的内置转换器DataTableConverter,它以缩写格式输出数据表.虽然它也有一个DataSet,它没有特定的内置转换器DataRow.因此,当序列化DataRow它时,它将序列化所有字段和属性,DataRow从而产生更详细的输出.
如果你想用DataRow更紧凑的形式 序列化一个DataTable,最简单的方法是将整个表序列化为一个JArray使用JArray.FromObject(),然后选出第一个元素,如下所示:
var rowIndex = 0;
var jArray = JArray.FromObject(datatable, JsonSerializer.CreateDefault(new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }));
var rowJToken = jArray[rowIndex];
var rowJson = rowJToken.ToString(Formatting.Indented); // Or Formatting.None if you prefer
Run Code Online (Sandbox Code Playgroud)
哪个输出:
Run Code Online (Sandbox Code Playgroud)public class DataRowConverter : JsonConverter<DataRow> { public override DataRow ReadJson(JsonReader reader, Type objectType, DataRow existingValue, bool hasExistingValue, JsonSerializer serializer) { throw new NotImplementedException(string.Format("{0} is only implemented for writing.", this)); } public override void WriteJson(JsonWriter writer, DataRow row, JsonSerializer serializer) { var table = row.Table; if (table == null) throw new JsonSerializationException("no table"); var contractResolver = serializer.ContractResolver as DefaultContractResolver; writer.WriteStartObject(); foreach (DataColumn col in row.Table.Columns) { var value = row[col]; if (serializer.NullValueHandling == NullValueHandling.Ignore && (value == null || value == DBNull.Value)) continue; writer.WritePropertyName(contractResolver != null ? contractResolver.GetResolvedPropertyName(col.ColumnName) : col.ColumnName); serializer.Serialize(writer, value); } writer.WriteEndObject(); } }
完整示例:
var row = datatable.Rows[rowIndex];
var settings = new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore,
Converters = { new DataRowConverter() },
};
var rowJson = JsonConvert.SerializeObject(row, Formatting.Indented, settings);
Run Code Online (Sandbox Code Playgroud)
作为此处找到的答案的替代方案,您可以使用ExpandoObject快速且轻松地将单行呈现为 JSON,如下所示:
var expando = new System.Dynamic.ExpandoObject() as IDictionary<string, object>;
foreach (DataColumn col in myRow.Table.Columns)
{
expando[col.ColumnName] = myRow[col];
}
var json = JsonConvert.SerializeObject(expando);
Run Code Online (Sandbox Code Playgroud)
小智 4
拼写?您对“SerializeObject”方法的调用不应该是:
string js = JsonConvert.SerializeObject(datatable);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15208 次 |
| 最近记录: |