Json 是否有方法使用包含值、错误和警告字段的通用基本响应?

Json 是否有方法使用包含值、错误和警告字段的通用基本响应?,json,httpresponse,onenote-api,Json,Httpresponse,Onenote Api,因此,根据官方文档示例,OneNote的响应可能具有以下结构: { value:{the content we requested}, error:{error if exists with warnings inside if exist}, @api.diagnostics:{warnings if exist} } 但是,如果响应体包含的不是JSON数组而是JSON对象,则响应如下 { Here would be entity, representing the cont

因此,根据官方文档示例,OneNote的响应可能具有以下结构:

{
  value:{the content we requested},
  error:{error if exists with warnings inside if exist},
  @api.diagnostics:{warnings if exist}
}
但是,如果响应体包含的不是JSON数组而是JSON对象,则响应如下

{
  Here would be entity, representing the content we requested
}
所以,我的下一个问题是:有没有办法统一OneNoteAPI的响应,因为当前的响应结构违反了其约定

由于我能够使用拦截器更改我的请求模块,因此输出看起来像我需要的,这似乎是一个棘手的解决办法,因此我希望看到有关此问题的正式信息。

OneNote API是OData API—这意味着它符合OData标准,其中数组作为value属性的一部分返回

数组中的实体在“value”属性中返回时:

{
值:[元素1,元素2,…],
}

而具体实体则不是

{
要素1
}

在任何支持泛型的语言中,通过使用odata有效负载的容器类,这都相对容易解决,如:

类ODataPayload{
公共IList值{get;set;}
}

通过这种方式,您可以在获取单个实体时解析“T”,在获取多个实体时解析ODataPayload

或者您也可以使用类似的方法来生成解析类


请注意,只有4xx ad 5xx状态代码才会返回错误。任何2xx状态代码都应该为您提供一个实体。

实际上,除了上面提到的一个肮脏的解决方法之外,没有其他方法。要重构OneNote(和其他公共服务)API,应该实现拦截器或类似servlet的东西,将所有未知属性(似乎是实体的属性)传输到新的根json属性,使其类似于数据集合表示的响应格式。因此,除非对API进行重构以匹配良好的风格,否则什么也做不了。希望微软的人能看到这一点,并就API实现需要在客户端进行服务器端工作的原因发表评论

谢谢你的回答,但你说的是我所说的我知道。问题如下-如何从响应数据(我们想要获得的实际数据)中分离错误和警告。目前,我正在使用GoogleGSON将反序列化过程定制为响应解析模型中的低级拦截器。因此,我在根json中执行移动额外字段的操作,除了“error”和“@api.diagnostics”,如果“value”不存在,则将其移动到根中名为“value”的新元素中,这样api的答案就不会因响应数据类型而有所不同。但这是一个非常肮脏的解决方法,因为它更具体:实体永远不应该包含错误,因为错误永远不应该包含实体。这是架构错误。就像我们说的干净体系结构一样,实体层应该包含通用响应格式,其中包括属性响应数据、错误描述(如果存在)和其他特殊字段,这些字段对于每个响应都是通用的。否则,可能会产生误解,当一个实体包含某个名称等于公共响应部分错误的字段时(例如,包含prop“error”的实体和包含prop“error”的一般响应)更新了我的响应。错误只会在4xx和5xx状态码中返回,实体只会在2xx状态码中返回。请告诉我我知道的情况,以防不太熟悉http的人都知道。显然,4xx和5xx代码是错误的标志,但是,伙计,我的应用程序不知道这一点,而且更重要的是,它不应该知道这一点。它需要数据,处理错误和警告。将实体放在根中是一种糟糕的做法。无论如何,现在我只是在value标签下移动非稳定(例如,除了error、@api.diagnostics和value之外的道具),一切正常。遗憾的是,OneNote开发者并不介意他们的api违反了一般合同。