Сопоставьте JSON с моделью независимо от массива или объекта — ObjectMapper

У меня возникли проблемы с сопоставлением JSON с моим классом объектов. Вот мой объект модели

class CityObject : NSObject, Mappable{
var id : String?
var name : String?

required init?(map: Map) {
}

func mapping(map: Map) {
    id <- map["id"]
    name <- map["name"]
}
}

Ответ JSON, который я иногда получаю от сервера, может быть массивом или таким объектом.

Множество:

{
"cities": [
{
  "id": "190",
  "name": "Elurupadu"
},
{
  "id": "1230",
  "name": "Sendhwa"
},
{
  "id": "1262",
  "name": "Multai"
},
{
  "id": "1480",
  "name": "Kherwara"
}]
}

Иногда я становлюсь таким,

{
"cities": {"id": "6","name": "Hyderabad"}
}

Вместо JSONArray он дает мне JSONObject.

Я сопоставляю свой класс вот так,

let list = Mapper<CityObject>().mapArray(JSONObject:cities["cities"])

Это отлично работает, когда я получаю JSONArray, но то же самое не работает, когда я получаю JSONObject.

Как справиться с обоими с помощью ObjectMapper?


person Naveen T P    schedule 29.06.2017    source источник
comment
Исправьте свой сервер. Он должен обеспечивать согласованную схему. В противном случае вам нужно будет условно преобразовать массив в массив, а если это не удастся, сопоставить со словарем.   -  person Paulw11    schedule 29.06.2017
comment
Поскольку сервер также получает этот ответ от третьей стороны, исправление на стороне сервера на данный момент невозможно. Можете ли вы предоставить небольшой фрагмент кода, чтобы иметь средство проверки на моей стороне?   -  person Naveen T P    schedule 29.06.2017
comment
@Neo, даже если ваш сервер получает данные от третьих лиц, перед отправкой их в свое приложение вы можете проверить, получаете ли вы массив словарей или один словарь на стороне сервера, и если это один словарь, оберните его в массив, чтобы в этом случае ваше приложение получает массив одного словаря. Или, если вы действительно не можете ничего изменить на стороне сервера, просто проверьте, удалось ли mapArray, а если нет, проанализируйте cities как один словарь.   -  person Dávid Pásztor    schedule 29.06.2017


Ответы (1)


Согласно предложению Paulw11, приведение к MAP сработало для меня.

if let list = Mapper<CityObject>().mapArray(JSONObject:cities["cities"]){
   //Handles JSONArray response
}
else if let list = Mapper<CityObject>().map(JSONObject: cities["cities"]){
  //Handles JSONObject response
}
else{
  //Handles error
}
person Naveen T P    schedule 29.06.2017