Newtonsoft自定义反序列化

前言:使用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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值