如何向 Moya.Response JSON 添加一个字段,该字段不在来自 http 响应的真实有效负载中

Posted

技术标签:

【中文标题】如何向 Moya.Response JSON 添加一个字段,该字段不在来自 http 响应的真实有效负载中【英文标题】:How to add a field to the Moya.Response JSON that wasn't in the real payload from the http response 【发布时间】:2017-06-18 15:50:09 【问题描述】:

如果我有:

import Moya
import RxSwift
import ObjectMapper
import Moya_ObjectMapper

provider.request(.callApi(id: id))
      .mapObject(Thing.self)
      .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
      .observeOn(MainScheduler.instance)

...

struct Thing: Mappable, Equatable 

  var id: String?

  init?(map: Map) 
  

  mutating func mapping(map: Map) 
    id <- map["id"]
  

进行 http api 调用并返回像 "id: "123" 这样的 json,一切都很好。使用正确的 id 创建了一个新的 Thing 结构。但是如果我想为 Thing 添加“风味”怎么办和硬编码 "id: "123", "flavor": "something".

即让我们修改实际的 http 响应正文并在它到达 .mapObject 方法之前添加"flavor": "something"。哪里是合适的地方?

这不仅仅是将它添加到 Thing 中的映射函数,因为每个 id 的“某物”都不同。可能是风味:“something1”,然后是风味:“something2”。我在与 callApi(id: id) 相同的范围内有这个值,所以类似于:

provider.request(.callApi(id: id))
      .addJSON("flavor", flavor)
      .mapObject(Thing.self)
      .subscribeOn(ConcurrentDispatchQueueScheduler(qos: .background))
      .observeOn(MainScheduler.instance)

但是.addJSON 是我刚刚编造的。它不存在。但是必须有一些简单的解决方案吗?

【问题讨论】:

最终直接使用 Alamofire 进行每个 http 调用,然后就很简单了。如果有人好奇,这一切都是为了github.com/andrewarrow/boring_company_chat。 【参考方案1】:

尝试修改实际的 JSON 感觉很脏,而且处于两个低级别。但是我去过那里,所以无法判断它是否有效。 :)

我会通过创建 Moya_ObjectMapper 提供的特殊版本的 Moya.Response 扩展方法来解决它。

public extension Response 

  /// Maps data received from the signal into an object which implements the Mappable protocol.
  /// If the conversion fails, the signal errors.
    public func mapObject<T: BaseMappable>(_ type: T.Type, context: MapContext? = nil) throws -> T 
        guard let object = Mapper<T>(context: context).map(JSONObject: try mapJSON()) else 
      throw MoyaError.jsonMapping(self)
    
   return object
  

我会添加一个类似的方法,但有一个额外的参数闭包 (T) -> (T)。因此,它实际上会在执行另一个映射后返回映射对象,该映射将添加您需要的任何必要信息。

【讨论】:

以上是关于如何向 Moya.Response JSON 添加一个字段,该字段不在来自 http 响应的真实有效负载中的主要内容,如果未能解决你的问题,请参考以下文章

如何在映射之前修改 Moya 响应?

如何向 JSON 数组值添加键?

如何向 JSON 请求添加一些参数?

如何向 JSON 对象数组添加值?

js中如何向json数组添加元素

如何阻止 jQuery ajax 向 JSON 字符串添加斜杠?