在很多項目中,都采用的前后端分離的方式進行開發,經常遇到后台的long精度的數據到前端丟失不准確,顯示效果為long類型(19位)的后幾位為000,此時需要對long的字段進行設置,改變默認的返回類型,由long類型改變為string類型。所以需要全局自定義修改long類型的返回類型
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
namespace NetCore3WebApiTemplate.Utility
{
public class CustomContractResolver : CamelCasePropertyNamesContractResolver
{
///// <summary>
///// 實現首字母小寫
///// </summary>
///// <param name="propertyName"></param>
///// <returns></returns>
//protected override string ResolvePropertyName(string propertyName)
//{
// return propertyName.Substring(0, 1).ToLower() + propertyName.Substring(1);
//}
/// <summary>
/// 對長整型做處理
/// </summary>
/// <param name="objectType"></param>
/// <returns></returns>
protected override JsonConverter ResolveContractConverter(Type objectType)
{
if (objectType == typeof(long))
{
return new JsonConverterLong();
}
return base.ResolveContractConverter(objectType);
}
///// <summary>
///// Creates a Newtonsoft.Json.Serialization.JsonProperty for the given System.Reflection.MemberInfo.
///// </summary>
///// <param name="type"></param>
///// <param name="memberSerialization"></param>
///// <returns></returns>
//protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
//{
// return type.GetProperties()
// .Select(p =>
// {
// var jp = base.CreateProperty(p, memberSerialization);
// jp.ValueProvider = new NullToEmptyStringValueProvider(p);
// return jp;
// }).ToList();
//}
}
}
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Text;
namespace NetCore3WebApiTemplate.Utility
{
/// <summary>
/// Long類型Json序列化重寫
/// 在js中傳輸會導致精度丟失,故而在序列化時轉換成字符類型
/// </summary>
public class JsonConverterLong : JsonConverter
{
/// <summary>
/// 是否可以轉換
/// </summary>
/// <param name="objectType"></param>
/// <returns></returns>
public override bool CanConvert(Type objectType)
{
return true;
}
/// <summary>
/// 讀json
/// </summary>
/// <param name="reader"></param>
/// <param name="objectType"></param>
/// <param name="existingValue"></param>
/// <param name="serializer"></param>
/// <returns></returns>
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if ((reader.ValueType == null || reader.ValueType == typeof(long?)) && reader.Value == null)
{
return null;
}
else
{
long.TryParse(reader.Value != null ? reader.Value.ToString() : "", out long value);
return value;
}
}
/// <summary>
/// 寫json
/// </summary>
/// <param name="writer"></param>
/// <param name="value"></param>
/// <param name="serializer"></param>
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
if (value == null)
writer.WriteValue(value);
else
writer.WriteValue(value + "");
}
}
}
在startup的ConfigureServices中設置
序列化的格式
options.SerializerSettings.ContractResolver = new CustomContractResolver();
時間格式:
options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
代碼如下:
/// <summary>
/// This method gets called by the runtime. Use this method to add services to the container.
/// </summary>
/// <param name="services"></param>
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(ops =>
{
}).SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddNewtonsoftJson(options =>
{
//設置時間格式
options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss";
options.SerializerSettings.ContractResolver = new CustomContractResolver();
});
}
注意:
AddNewtonsoftJson 方法需要應用Microsoft.AspNetCore.Mvc.NewtonsoftJson
