[英]JSON.NET - How do I include Type Name Handling for primitive C# types that are stored in an array/list as Object type
我正在使用Newtonsoft JSON.NET为我序列化/反序列化。 但我有这个列表,其中它们是Object
类型:
var list = new List<Object>()
{
"hi there",
1,
2.33
};
当我将TypeNameHandling
设置为TypeNameHandling.All
序列化时,我希望它也会为列表中的每个实例提供$type
,但似乎不是这种情况。 这是实际输出:
{
"$type": "System.Collections.Generic.List`1[[System.Object, mscorlib]], mscorlib",
"$values": [
"hi there",
1,
2.33
]
}
我需要对这些原始类型具有特定的类型名称处理,因为如果我将Int32
值添加到列表中,并且在反序列化后它返回时,JSON.NET将其设置为Int64
。 这对我来说是一件大事,因为我试图调用一些方法并且这样做我需要比较参数,它们必须具有相同的类型。 是否有一种方法或设置可以在JSON.NET中设置以实现我的需求?
我已经看过这篇文章,但它的作用是他试图改变默认行为并总是返回Int32
,这不是我想要的。
任何帮助,将不胜感激。 谢谢
您可以为基本类型创建包装类,包含所需的隐式运算符:
class TypeWrapper
{
public object Value { get; set; }
public string Type { get; set; }
public static implicit operator TypeWrapper(long value)
{
return new TypeWrapper { Value = value, Type = typeof(long).FullName };
}
public static implicit operator long(TypeWrapper value)
{
return (long)value.Value;
}
public static implicit operator TypeWrapper(int value)
{
return new TypeWrapper { Value = value, Type = typeof(int).FullName };
}
public static implicit operator int(TypeWrapper value)
{
return (int)value.Value;
}
}
然后在序列化数据时会有元素'类型:
var data = new List<TypeWrapper> { 1, 2L };
var json = Newtonsoft.Json.JsonConvert.SerializeObject(data);
Console.WriteLine(json);
// result: [{"Value":1,"Type":"System.Int32"},{"Value":2,"Type":"System.Int64"}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.