9

几乎所有关于将 C# 与JSON结合使用的问题的答案似乎都是“使用 JSON.NET”,但这不是我要寻找的答案。

我这么说的原因是,从我在文档中读到的所有内容来看,JSON.NET 基本上只是 .NET 框架中内置的 DataContractSerializer 性能更好的版本......

这意味着如果我想反序列化一个 JSON 字符串,我必须为我可能拥有的每个请求定义完整的强类型类。因此,如果我需要获取类别、帖子、作者、标签等,我必须为这些内容中的每一个定义一个新类。

如果我构建了客户端并确切知道字段是什么,这很好,但我使用的是其他人的 API,所以我不知道合同是什么,除非我下载示例响应字符串并从 JSON 字符串手动创建类.

这是唯一的方法吗?有没有办法让它创建一种可以用 json["propertyname"] 读取的哈希表?

最后,如果我必须自己构建这些类,那么当 API 发生变化而他们没有告诉我时会发生什么(因为 twitter 似乎因为这样做而臭名昭著)?我猜我的整个项目都会中断,直到我进入并更新对象属性......

那么使用 JSON 时的一般工作流程到底是什么?一般来说,我的意思是与图书馆无关。我想知道一般情况下它是如何完成的,而不是专门针对目标库......

4

2 回答 2

5

很难按照您的要求与库无关,因为您使用 json 的方式实际上取决于您使用的库。作为 JSON.NET 中的示例,您可以通过多种方式使用 JSON。您所说的方法是直接序列化为对象。这是类型安全的,但如果您的 API 中的数据发生更改,则会中断。但是,还有一个 LINQ-to-JSON 提供了一个 JObject(其行为与 XElement 非常相似),它提供了一种按照您在问题中请求的方法来执行 JObject["key"] 的方法。如果您真的只是在寻找一种在 C# 中使用 JSON 的灵活方法,请查看 JSON.NET 的 LINQ-to-JSON。

实际上,无论您如何操作,如果 API 发生更改,您的代码都可能会中断。即使您只是严格地基于哈希表的方法,如果返回的数据发生更改,您的代码仍然可能会中断。

编辑

JSON.NET 文档

例子

如果您查看示例,第二个示例应该为您提供了一个很好的示例,说明 LINQ-to-JSON 的工作原理。它允许您在不定义任何类的情况下使用它。一切都转换为标准框架类(主要是集合和字符串)。这避免了维护类的需要。

于 2010-06-01T15:30:23.347 回答
0

我从事 Perl 开发人员已有十多年了,而且我最近才开始使用 C#。我对我有多喜欢它感到惊讶(我根本不喜欢 Java),但最困难的认知转换之一是从“一切都可以被视为字符串并且语言负责转换”到“Pre -定义你的类型。” 在这种情况下,字符串思维可能是一个优势,因为这是您需要为您要求的那种 API 做的事情。

您需要编写一个理解语法的 JSON 解析器,这相当简单:逗号分隔的列表、键/值对、{} 用于哈希/对象、[] 用于数组以及引用/转义结构。由于 JSON 中的顶级实体始终是一个对象,因此您需要创建一个 Hashtable 开始,然后逐个字符地扫描 JSON 字符串。提取键/值对;如果值以 { 开头,则将其添加为新的 Hashtable,如果以 [ 开头,则将其添加为新的 ArrayList,否则将其添加为字符串。如果您获得 { 或 [ 您将需要递归下降以添加子数据元素。

如果 .NET 有一个很好的递归下降解析器,您可能可以使用它来使工作更简单或更健壮,但 JSON 足够简单,可以使它成为一个很好且相当可完成的练习。

于 2010-06-01T16:17:35.200 回答