Objectmapper: Как поставить условия в методе картографирования?

Созданный на 5 окт. 2016  ·  4Комментарии  ·  Источник: tristanhimmelman/ObjectMapper

Я пытаюсь реализовать структуру StreetAddress из Google Map Place API, но не знаю, как можно гибко использовать метод сопоставления, я не видел ничего связанного с этим в текущей документации.

Например, в моей структуре у меня есть номер улицы и свойство маршрута.
Вот образец ответа JSON от Google API:

"address_components": [
{
"long_name": " 36 ",
"short_name": "36",
"типы": [
"номер улицы"
]
},
{
"long_name": " Rue de Dunkerque ",
"short_name": "Rue de Dunkerque",
"типы": [
"маршрут"
]
},

Я не видел способа установить условия охраны, примерно так:

guard let components = map ["result.address_components"] как? [[String: Any]] else {
возвращение
}
// Другие...

Тогда я мог бы найти способ вручную получить эту информацию, но, конечно, это начало примера кода не работает.

Нужна ли для этого трансформация или есть другой способ?

Самый полезный комментарий

Хорошо, вот что я подумал, спасибо за это чистое решение, человек, очень полезный!

Все 4 Комментарий

Я не уверен, что вы собираетесь делать. Если хочешь ...

  1. Сделать инициализатор неудачным, если в JSON нет result.address_components .

=> См. Https://github.com/Hearst-DD/ObjectMapper#init_ -map-map

  1. Вместо этого используйте значение по умолчанию, если в JSON нет result.address_components .

=> Возможно, вам потребуется использовать Transform . Смотрите мой ответ в аналогичном вопросе: # 606

На самом деле нет result.address_components содержит массив, в котором я хочу получить разные значения. Извините, образец JSON в моем первом посте неправильно отформатирован.

У меня есть эти два свойства на стороне клиента:

var route: String?
var streetNumber: String?

Эти два значения представлены в массиве address_components и зависят от свойства «тип» в каждом объекте этого массива. Поэтому мне нужны условия, чтобы сопоставить их с соответствующими свойствами

Маршрут должен быть сопоставлен со значением: Rue de Dunkerque & streetNumber должно быть равно 36.

О, я понял. В этом случае вы должны использовать свой собственный Transform . Я бы так сделал:

struct AddressComponent {
  var route: String?
  var streetNumber: String?
}

let addressComponentRouteTransform = TransformOf<[[String: Any]], AddressComponent>(
  // Input:
  //     [
  //       {
  //         "long_name": "36",
  //         "short_name": "36",
  //         "types": [
  //           "street_number"
  //         ]
  //       },
  //       {
  //         "long_name": "Rue de Dunkerque",
  //         "short_name": "Rue de Dunkerque",
  //         "types": [
  //           "route"
  //         ]
  //       }
  //     ]
  //
  // Output:
  //     AddressComponent(route: "36", streetName: "Rue de Dunkerque")
  fromJSON: { (componentDicts: [[String: Any]]?) -> AddressComponent?
    let route = componentDicts?.lazy
      .filter {
        guard let types = $0["types"] as? [String] else { return false }
        return types.contains("route")
      }
      .flatMap {
        $0["long_name"] as? String
      }
    let streetNumber = componentDicts?.lazy
      .filter {
        guard let types = $0["types"] as? [String] else { return false }
        return types.contains("street_number")
      }
      .flatMap {
        $0["long_name"] as? String
      }
  },

  // Input:
  //     AddressComponent(route: "36", streetName: "Rue de Dunkerque")
  //
  // Output:
  //     [
  //       {
  //         "long_name": "36",
  //         "short_name": "36",
  //         "types": [
  //           "street_number"
  //         ]
  //       },
  //       {
  //         "long_name": "Rue de Dunkerque",
  //         "short_name": "Rue de Dunkerque",
  //         "types": [
  //           "route"
  //         ]
  //       }
  //     ]
  toJSON: { (component: AddressComponent?) -> [[String: Any]]?
    var componentDicts: [[String: Any]] = []
    if let route = component?.route {
      componentDicts.append([
        "long_name": route,
        "short_name": route,
        "types": [
          "route",
        ],
      ])
    }
    if let streetNumber = component?.streetNumber {
      componentDicts.append([
        "long_name": streetNumber,
        "short_name": streetNumber,
        "types": [
          "street_number",
        ],
      ])
    }
    return componentDicts
  }
)

struct Venue {
  var address: AddressComponent

  mutating func mapping(map: Map) {
    self.address <- (map["address_components"], addressComponentRouteTransform)
  }
}
Совет: используйте 3 обратных кавычки (`), чтобы создать блок кода в уценке.

func doSomething() {
}
func doSomething() {
}
Или вы можете использовать `
`тег, если вы хотите выделить где-нибудь жирный текст.

<pre>
func <strong>doSomething</strong>() {
}
</pre>
 func doSomething () {
 }

Хорошо, вот что я подумал, спасибо за это чистое решение, человек, очень полезный!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги