字典<字符串、对象>如何知道值的类型?



请考虑以下代码:

JObject obj = JObject.Parse(json);
Dictionary<string,object> dict = new Dictionary<string, object>();
List<string> parameters = new List<string>{"Car", "Truck", "Van"};
foreach (var p in parameters)
{
JToken token = obj.SelectToken(string.Format("$.results[?(@.paramName == '{0}')]['value']", p));
dict[p] = token.Value<object>();
}
string jsonOutput = JsonConvert.SerializeObject(dict);

其中json包含,部分:

{
"paramName": "Car",
"value": 68.107
},
{
"paramName": "Truck",
"value": 48.451
},
{
"paramName": "Van",
"value": 798300
}

在调试时,我检查了字典,发现值不是类型object而是实际的数字类型,如integerfloat。由于字典被声明为Dictionary<string, object> dict = new Dictionary<string, object>();我希望这些值是object类型,并且我需要在使用时强制转换它们。

JSON 输出字符串为{"Car":68.107,"Truck":48.451,"Van":798300}

字典如何知道值的类型,为什么我得到实际类型而不是基本类型object

当你打电话时

JsonConvert.SerializeObject(dict);

这将获取一个对象,然后该对象确定类型,并相应地存储它。

因此,对于字典条目中的每个项目。 它首先检查类型,然后根据其类型对其进行反序列化。

如果你想在 JSON 之外使用对象,你必须用类似的东西来检查自己

var o = dict["Car"];
if(o is int) return (int)o; // or whatever you want to do with an int
if(o is decimal) return (decimal)o; // or whatever you want to do with an decimal

在调试器中检查实例时,调试器仅显示该项.ToString()的输出。运行以下代码:

namespace ConsoleApplication1
{
public class Program
{
private static void Main(string[] args)
{
var dic = new Dictionary<string, object>
{
{ "One", "1" }, { "Two", 2 },
{ "Three", 3.0 }, { "Four", new Person() },
{ "Five", new SimplePerson() },
};
foreach (var thisItem in dic)
{
// thisItem.Value will show "1", 2, 3, "Test" 
// and ConsoleApplication1.SimplePerson
Console.WriteLine($"{ thisItem.Key } : { thisItem.Value }");
}
var obj = JsonConvert.SerializeObject(dic);
}
}
public class SimplePerson
{
}
public class Person
{
public override string ToString()
{
return "Test";
}
}
}

当您将鼠标悬停在this.Value上时,它将显示ToString()的结果。因此,它将显示以下内容:

"1"
2
3
"Test" // since Person class overrides the ToString()
// since by default when ToString() is called it will print out the object.
ConsoleApplication1.SimplePerson 

序列化

对于序列化,它将生成以下内容:

{
"One": "1",
"Two": 2,
"Three": 3.0,
"Four": {
},
"Five": {
}
}

它们都装箱为object类型,但当基础类型为任何类型时。因此,在我们的例子中String",Int,双重,and简单人'。因此,在序列化期间,它是未装箱的。

相关内容

  • 没有找到相关文章

最新更新