对如何在C#中使用JSON感到困惑

时间:2010-06-01 15:15:21

标签: c# .net json serialization datacontract

关于使用带有JSON的C#的每一个问题的答案似乎是“使用JSON.NET”,但这不是我正在寻找的答案。

我说的原因是,从我在文档中可以阅读的所有内容来看,JSON.NET基本上只是构建在.NET框架中的DataContractSerializer的更好表现版本......

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

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

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

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

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

2 个答案:

答案 0 :(得分:5)

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

实际上,无论你如何操作,如果API发生变化,你的代码可能会中断。即使你只是一个基于散列表的方法,如果数据返回的话你的代码仍然可能会中断。

修改

JSON.NET Documentation

Examples

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

答案 1 :(得分:0)

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

您需要编写一个理解the syntax的JSON解析器,这非常简单:以逗号分隔的列表,键/值对,{}用于散列/对象,[]用于数组,以及引用/转义构造。您将要创建一个Hashtable,因为JSON中的顶级实体始终是一个对象,然后逐个字符地扫描JSON字符串。拉出键/值对;如果值以{开头,则将其添加为新的Hashtable,如果它以[将其添加为新的ArrayList开头,否则将其添加为字符串。如果你得到{或[你需要以递归方式下降来添加子数据元素。

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