覆盖Json.Net中的默认原始类型处理 [英] Overriding Default Primitive Type Handling in Json.Net
问题描述
在处理原始类型时,是否有一种方法可以覆盖Json.net的默认反序列化行为?例如,当将json数组[3.14,10,"test"]
反序列化为object[]
3.14 的类型为double
且 10 的类型为long
.无论如何,有没有办法我可以拦截或覆盖此类型决策,以便分别将值反序列化为decimal
和int
?
Is there a way to override the default deserialization behaviour of Json.net when handling primitive types? For example when deserializing the json array [3.14,10,"test"]
to a type of object[]
3.14 will be of type double
and 10 will be of type long
. Is there anyway I can intercept or override this type decision so I could deserialize the values as decimal
and int
respectively?
我基本上总是希望json整数总是以int
返回,并浮动为以decimal
返回.这样可以省去一些在代码中将double
转换为decimal
的麻烦.
I basically always want json integers to always return as int
and floats to return as decimal
. This will save me some having to inject double
to decimal
conversions in my code.
我已经研究了扩展Newtonsoft.Json.Serialization.DefaultContractResolver
并实现自己的Newtonsoft.Json.JsonConverter
的方法,但是我还没有发现任何实现此所需覆盖的方法.
I've looked into extending Newtonsoft.Json.Serialization.DefaultContractResolver
and implementing my own Newtonsoft.Json.JsonConverter
but I have not discovered any way to implement this desired override.
要复制的示例代码
object[] variousTypes = new object[] {3.14m, 10, "test"};
string jsonString = JsonConvert.SerializeObject(variousTypes);
object[] asObjectArray = JsonConvert.DeserializeObject<object[]>(jsonString); // Contains object {double}, object {long}, object {string}
推荐答案
我认为这应该可行
public class MyReader : JsonTextReader
{
public MyReader(string s) : base(new StringReader(s))
{
}
protected override void SetToken(JsonToken newToken, object value)
{
object retObj = value;
if (retObj is long) retObj = Convert.ChangeType(retObj, typeof(int));
if (retObj is double) retObj = Convert.ChangeType(retObj, typeof(decimal));
base.SetToken(newToken, retObj);
}
}
object[] variousTypes = new object[] { 3.14m, 10, "test" };
string jsonString = JsonConvert.SerializeObject(variousTypes);
JsonSerializer serializer = new JsonSerializer();
var asObjectArray = serializer.Deserialize<object[]>(new MyReader(jsonString));
这篇关于覆盖Json.Net中的默认原始类型处理的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!