我尝试使用JObject(NewtonSoft.dll)将DataTable转换为JSON字符串。在我的情况下,表可能具有不同数据类型的值。我想在序列化对象时将这些值转换为字符串。
DataTable tab = new DataTable();
tab.Columns.Add("ID", typeof(int));
tab.Columns.Add("Name");
tab.Rows.Add(1, "Role1");
tab.Rows.Add(2, "Role2");
string strValues = JsonConvert.SerializeObject(tab);
--output of strValues
-- [{"ID":1,"Name":"Role1"},{"ID":2,"Name":"Role2"}]
但它应该是这样的 -
[{" ID":" 1""名称":"基于role1"},{" ID&#34 ;:" 2""名称":"基于role2"}]
请给我解决方案。感谢
答案 0 :(得分:3)
您可以使用第三方.dll,如Newtonsoft.Json
DataTable tab = new DataTable();
tab.Columns.Add("ID", typeof(int));
tab.Columns.Add("Name");
tab.Rows.Add(1, "Role1");
tab.Rows.Add(2, "Role2");
// Serialize to JSON string
TextWriter output = new TextWriter();
JsonTextWriter writer = new JsonTextWriter(output);
writer.Formatting = JsonFormatting;
JsonSerializer serializer = JsonSerializer.Create(JsonSerializerSettings);
serializer.Serialize(writer, tab);
writer.Flush();
答案 1 :(得分:0)
为什么不能将ID列保存为字符串,如下所示:
ON DUPLICATE KEY UPDATE pivot_data.goals = VALUES(goals)
或者简单地说:
tab.Columns.Add("ID", typeof(string));
我没有看到将其保存为Int的目的,然后尝试将其转换为String ...
答案 2 :(得分:0)
Json.Net随附的DataTableConverter
无法自定义其写入值的方式。但是,如果要将整数(或任何其他值类型)呈现为字符串,则可以轻松地使自己的自定义DataTableConverter
执行所需操作。以下是您需要的代码:
class CustomDataTableConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return (objectType == typeof(DataTable));
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
DataTable table = (DataTable)value;
JArray array = new JArray();
foreach (DataRow row in table.Rows)
{
JObject obj = new JObject();
foreach (DataColumn col in table.Columns)
{
object val = row[col];
obj.Add(col.ColumnName, val != null ? val.ToString() : string.Empty);
}
array.Add(obj);
}
array.WriteTo(writer);
}
public override bool CanRead
{
get { return false; }
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
像这样使用转换器:
string strValues = JsonConvert.SerializeObject(tab, new CustomDataTableConverter());