【问题标题】:What is the object in Dictionary<string, object> when Deserializing Json using JavaScriptSerializer?使用 JavaScriptSerializer 反序列化 Json 时 Dictionary<string, object> 中的对象是什么?
【发布时间】:2012-03-29 03:57:19
【问题描述】:

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

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

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

我认为我什至不需要这里,对吧?因为没有根对象,只有键/值(属性/值)对所以对每个 json 属性/值都不好?

【问题讨论】:

  • JSON,严格来说,没有定义对象的顺序。 [1,2,3] 可能会反序列化为列表,但 {k:v} 不是列表。这是一张地图。
  • 所以这真的是我在上面那个示例 json 中拥有的一个 json 对象......带有一堆属性......
  • 这是一种看待它的方式,是的。

标签: c# .net json


【解决方案1】:

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

JSON 建立在两种结构之上:

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

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

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

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

【讨论】:

  • 宁愿只是利用 JavaScriptSerializer,而不是仅仅为了从 json 中获取一个仅具有一堆属性的对象这样简单的事情使用整个库.. 一级没有嵌套树或任何东西在里面。我不喜欢使用像 JSON.NET 这样的大型 3rd 方框架,直到事情变得如此复杂以至于我不得不这样做。对于现有的 JavaScriptSerializer,这必须很简单,而不必在此示例中引用 JSON.NET 之类的整个库。
  • @user1286569,是的 - 我同意你的观点,但我对使用 JavaScriptSerializer 也有点不同,因为 MS 曾经试图使其过时 (stackoverflow.com/questions/536359/…) 基于替代数据合同的序列化程序需要转换时指定的类型。让我们希望 .NET 4.5 能够通过引入 System.Json - msdn.microsoft.com/en-us/library/system.json%28v=vs.110%29.aspx 来简化问题
【解决方案2】:

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

在 .Net 中它是 Dictionary&lt;string, object&gt;,因为属性的名称始终是字符串,但值可以是 JSON 序列化支持的任何类型(字符串、布尔值、数组、对象或数字)。

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

【讨论】:

  • 好的,所以我的字典里只有一个条目。这里只有一个对象,但字符串键包含什么?没有?空字符串?
  • 查看我对通话结果的编辑(您可能也应该获得 LINQPad 并自己尝试一下......)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多