使用JavaScriptSerializer反序列化Json时,Dictionary <string,object =“”>中的对象是什么?</string,>

时间:2012-03-29 03:57:20

标签: c# .net json

我知道JSON是什么,但我不明白你在一堆属性/值对的字符串中反序列化一个简单的json属性/值对,如下所示:{"fileName":"SomeName, "FilePath":"SomePath"}那么对象是什么反序列化后在字典中表示的字符串?

我们所拥有的只是一个键/值对,对我来说就是一个对象,但字典中的字符串是什么,关键是什么?但是什么样的关键,为什么我需要一本字典来反序列化呢?为什么不只是List和对象只包含您的键/值对?或者可能列出与对象相同的列表,但您使用的是自定义类型。

我只是想了解何时反序列化为字典,反序列化后字典中的字符串和对象是什么..更多字符串在字典中。

我认为我甚至不需要在这里吗?因为没有根对象,只有键/值(属性/值)对,所以对每个json属性/值都没有问题?

2 个答案:

答案 0 :(得分:2)

从JSON角度来看,{"fileName":"SomeName, "FilePath":"SomePath"}表示具有给定属性和相应值的对象。您还必须注意,在java脚本中,每个对象本质上都是字典/映射,但因此JSON表示中没有字典数据类型 - JSON规范使用术语object来引用名称/值的集合对。引自specs

  

JSON基于两种结构:

     

名称/值对的集合。在各种语言中,这被实现为对象,记录,结构,字典,散列表,键控列表或关联数组。

     

有序的值列表。在大多数语言中,这是作为一个数组实现的,   矢量,列表或序列。

进行反序列化,JS中的反序列化无论如何都是一个对象(也是一个字典,因为这就是JS对象的方式)。对C#进行反序列化,可以将JSON反序列化为映射到相同JSON格式的不同类型。例如,可以将所述JSON反序列化为Dictionary<string, string>或具有名称fileNameFilePath的字符串属性的类实例(或者它可以是HashTable或者它可以一个具有多个属性但只有相应的两个被标记为序列化的结构/类。

通常,如何使用特定的反序列化器来决定反序列化后的类型--AFAIK,.NET提供的序列化器接受反序列化的类型并生成该类型的实例。对于Dictionary<string, string>反序列化,JSON.NET就是答案 - 请参阅How can I deserialize JSON to a simple Dictionary<string,string> in ASP.NET?

答案 1 :(得分:0)

{"fileName":"SomeName, "FilePath":"SomePath"}是一个具有3个属性的对象。由于JavaScript中的对象本质上是属性的字典,因此在其他语言中表示它们的最明显方式是对应的Dictionary / HashTable。

在.Net中它是Dictionary<string, object>,因为propertye的名字总是字符串,但是值可以是JSON序列化支持的任何类型(字符串,bool,数组,对象或数字)。

因此new JavaScriptSerializer().DeserializeObject("{\"fileName\":\"SomeName\", \"FilePath\":\"SomePath\"}")的结果是Dictionary<string, object>类型的对象,其中包含对象的所有2个属性的列表:字符串键“fileName”,其对应值为“SomeName”(类型字符串,存储为对象在字典中)和“FilePath”,其值为“SomePath”。