c# - 使用 Json.NET 反序列化为 DataTable,同时将嵌套令牌保留为 JSON
问题描述
我正在做一个简单的
JsonConvert.DeserializeObject<DataTable>(result.ToString());
源 JSON 可能有嵌套对象。转换器创建嵌套数据表。我只想将根对象转换为 DataTable,并将嵌套对象存储到字符串列中。那可能吗?我看过JsonSerializerSettings
但我似乎没有看到相关的设置。
我可以稍后重新序列化嵌套的 DataTable,但这需要更多的处理,并且一些嵌套对象并不一致,我最终会ArgumentException
在反序列化期间得到一个。
解决方案
您将需要一个自定义 DataTable 转换器来完成此操作。我改编了这个答案。
主要思想是检测属性是否包含带有if (rowDataObj[col.ColumnName].Type == JTokenType.Array)
. 在这种情况下,我们只需使用.ToString()
以保留原始字符串。
class Program
{
static void Main(string[] args)
{
var json = @"[{""Name"":""John"",""Age"":""22"",""Json"":[{""Prop"":1}]},"
+ @"{""Name"":""Eric"",""Age"":""25"",""Json"":[{""Prop"":2}]},"
+ @"{""Name"":""Joan"",""Age"":""38"",""Json"":[{""Prop"":3}]}]";
var table = JsonConvert.DeserializeObject<DataTable>(json,
new CustomDataTableConverter());
foreach (DataRow row in table.Rows)
{
Console.WriteLine($"{row["Name"]}, {row["Age"]}, {row["Json"]}");
}
}
}
public class CustomDataTableConverter : JsonConverter
{
public override bool CanConvert(Type objectType) => (objectType == typeof(DataTable));
public override bool CanWrite => false;
public override object ReadJson(JsonReader reader, Type objectType,
object existingValue, JsonSerializer serializer)
{
var rowsArray = JArray.Load(reader);
var metaDataObj = (JObject)rowsArray.First();
var dt = new DataTable();
foreach (var prop in metaDataObj.Properties())
{
dt.Columns.Add(prop.Name);
}
foreach (JObject rowDataObj in rowsArray)
{
var row = dt.NewRow();
foreach (DataColumn col in dt.Columns)
{
if (rowDataObj[col.ColumnName].Type == JTokenType.Array)
{
row[col] = rowDataObj[col.ColumnName].ToString(Formatting.None);
}
else
{
row[col] = rowDataObj[col.ColumnName].ToObject(col.DataType);
}
}
dt.Rows.Add(row);
}
return dt;
}
public override void WriteJson(JsonWriter writer, object value,
JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
结果是:
John, 22, [{"Prop":1}]
Eric, 25, [{"Prop":2}]
Joan, 38, [{"Prop":3}]
推荐阅读
- nginx - Nginx 两个角度应用程序
- spring - Spring Boot Kafka:使用特定主题的所有实例使用相同的消息
- xml - xslt 基于特殊字符分割字符串
- c# - Range.AutoFilter - 包含字符串的值
- python - CSV 数据到 MySQL 表
- c# - WindowHandles 在 IE 上不起作用:未切换到新选项卡
- python - 从python中的dict列表中提取dict值
- django - AWS S3 存储桶返回 403 禁止
- azure-active-directory - 是否可以使用 msal.js 为 SPA 网站实现切换帐户功能?
- python - 什么更好,一次阅读所有页面或在 python-camelot 中逐页阅读?