gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:44:10 25 4
gpt4 key购买 nike

我正在使用 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 中设置来实现我需要的吗?

我看过这个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"}]

关于c# - JSON.NET - 如何为作为对象类型存储在数组/列表中的原始 C# 类型包含类型名称处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35592256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com