关于使用带有JSON的C#的每一个问题的答案似乎是“使用JSON.NET”,但这不是我正在寻找的答案。
我说的原因是,从我在文档中可以阅读的所有内容来看,JSON.NET基本上只是构建在.NET框架中的DataContractSerializer的更好表现版本......
这意味着如果我想反序列化JSON字符串,我必须为我可能拥有的每个请求定义完整的强类型类。因此,如果我需要获取类别,帖子,作者,标签等,我必须为每一件事定义一个新类。
如果我构建了客户端并确切知道字段是什么,这很好,但是我正在使用别人的API,所以我不知道合同是什么,除非我下载一个示例响应字符串并手动创建类JSON字符串。
这是唯一的方法吗?有没有办法让它创建一种可以用json [“propertyname”]读取的哈希表?
最后,如果我必须自己构建这些类,那么当API发生变化并且他们没有告诉我(因为Twitter似乎因为这样做而臭名昭着)时会发生什么?我猜我的整个项目都会中断,直到我进入并更新对象属性......
那么使用JSON时的一般工作流程究竟是什么?一般来说,我的意思是与图书馆无关。我想知道它是如何完成的,而不是专门针对目标库......
答案 0 :(得分:5)
您要求与库无关是非常困难的,因为您使用json的方式实际上取决于您使用的库。作为JSON.NET中的一个示例,有多种方法可以使用JSON。您可以通过直接序列化到对象来讨论该方法。这是类型安全的,但如果API中的数据发生更改,则会中断。但是,还有一个LINQ-to-JSON提供了一个JObject(其行为与XElement非常相似),提供了一种方法来按照您在问题中的要求执行JObject [“key”]。如果您真的只是想在C#中使用JSON的灵活方式,那么请查看JSON.NET的LINQ-to-JSON。
实际上,无论你如何操作,如果API发生变化,你的代码可能会中断。即使你只是一个基于散列表的方法,如果数据返回的话你的代码仍然可能会中断。
修改强>
如果您查看示例,第二个应该为您提供LINQ-to-JSON如何工作的一个很好的示例。它允许您使用它而无需定义任何类。一切都转换为标准框架类(主要是集合和字符串)。这避免了维护类的需要。
答案 1 :(得分:0)
我已经成为Perl开发人员已有十多年了,我最近才开始使用C#。我对它的喜欢程度感到惊讶(我根本不喜欢Java),但最困难的认知转换之一就是从“一切都可以被视为一个字符串,语言处理转换”到“Pre” - 定义你的类型。“在这种情况下,字符串思考可能是一个优势,因为这是您需要为您要求的API类型所做的事情。
您需要编写一个理解the syntax的JSON解析器,这非常简单:以逗号分隔的列表,键/值对,{}用于散列/对象,[]用于数组,以及引用/转义构造。您将要创建一个Hashtable,因为JSON中的顶级实体始终是一个对象,然后逐个字符地扫描JSON字符串。拉出键/值对;如果值以{开头,则将其添加为新的Hashtable,如果它以[将其添加为新的ArrayList开头,否则将其添加为字符串。如果你得到{或[你需要以递归方式下降来添加子数据元素。
如果.NET有一个很好的递归下降解析器,你可以使用它来使工作更简单或更健壮,但JSON很简单,足以使它成为一个很好的,可以合理完成的练习。