加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

JSON.NET – 如何为存储在数组/列表中作为对象类型的原始C#类型

发布时间:2020-12-16 19:49:18 所属栏目:百科 来源:网络整理
导读:我正在使用Newtonsoft JSON.NET为我序列化/反序列化.但我有这个列表,其中它们是对象类型: var list = new ListObject() { "hi there",1,2.33 }; 当我将TypeNameHandling设置为TypeNameHandling.All进行序列化时,我希望它也会为列表中的每个实例提供$类型,但
我正在使用Newtonsoft JSON.NET为我序列化/反序列化.但我有这个列表,其中它们是对象类型:
var list = new List<Object>() 
{ 
    "hi there",1,2.33  
};

当我将TypeNameHandling设置为TypeNameHandling.All进行序列化时,我希望它也会为列表中的每个实例提供$类型,但似乎不是这种情况.这是实际输出:

{
    "$type": "System.Collections.Generic.List`1[[System.Object,mscorlib]],mscorlib","$values": [
        "hi there",2.33
    ]
}

我需要这个原始类型具有特定的类型名称处理,因为如果我在列表中添加一个Int32值,并在反序列化后返回它,JSON.NET将其设置为Int64.这对我来说是一件大事,因为我试图调用一些方法并且这样做我需要比较参数,它们必须具有相同的类型.有没有可以在JSON.NET中设置的方法或设置来实现我的需求?

我已经看过这个post,但它的作用是他试图改变默认行为并且总是返回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"}]

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读