前言:使用Newtonsoft反序列化时,当需要把json格式的文本转成Datatable时,当第一行数据是整数,第二行数据是小数的时候,此时反序列化出来的数据就会不一致,小数部分会被四舍五入成整数。
解决方案
使用自定义序列化,全部转成string即可。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Data;
using System.Text;
namespace TEST
{
public class DataTableConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(DataTable);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
JArray array = JArray.Load(reader);
DataTable table = new DataTable();
// 添加列
if (array.HasValues)
{
JObject firstRow = (JObject)array[0];
foreach (var property in firstRow.Properties())
{
table.Columns.Add(property.Name, typeof(string));
}
}
// 填充数据
foreach (JToken token in array.Children())
{
DataRow row = table.NewRow();
foreach (JProperty prop in token)
{
row[prop.Name] = prop.Value.ToObject(typeof(string));
}
table.Rows.Add(row);
}
return table;
}
private Type GetColumnType(JToken value)
{
switch (value.Type)
{
case JTokenType.Integer:
return typeof(int);
case JTokenType.Float:
return typeof(decimal);
case JTokenType.String:
return typeof(string);
case JTokenType.Boolean:
return typeof(bool);
case JTokenType.Date:
return typeof(DateTime);
default:
return typeof(object);
}
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException("Writing to JSON is not supported.");
}
}
}
调用
var settings = new JsonSerializerSettings
{
Converters = new JsonConverter[] { new DataTableConverter() }
};
DataTable table = Newtonsoft.Json.JsonConvert.DeserializeObject<DataTable>(data, settings);