JSON.NET - 如何将存储在数组/列表中的基元 C# 类型作为对象类型包含类型名称处理

本文关键字:类型 对象 处理 包含 NET 存储 列表 数组 JSON | 更新日期: 2023-09-27 18:35:52

我正在使用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这不是我想要的。

任何帮助将不胜感激。谢谢

JSON.NET - 如何将存储在数组/列表中的基元 C# 类型作为对象类型包含类型名称处理

您可以为基元类型创建一个包装类,根据需要包含隐式运算符:

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"}]