Невозможно проанализировать под двойной строкой с помощью Object Mapper

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

var latitude: String?
var longitude: String?

Я пытаюсь разобрать модель. Все анализируется правильно, но только эти два поля никогда не анализируются.

Вот полная модель

import ObjectMapper
class BarberLoginModel: Mappable {
var id: Int?
var barberShopId: Int = 0
var firstName = ""
var lastName = ""
var mobileNo = ""
var userName = ""
var email = ""
var imgPath = ""
var shopName = ""
var address = ""
var street = ""
var area = ""
var emirates = ""
var latitude: String?
var longitude: String?
var Services: [ServiceModel]?
var Stylist: StylistArrayModel?
var Availability: [AvailabilityModel]?
var Facilities: [FacilitiesModel]?

required init?(map: Map) {

}

func mapping(map: Map) {
    id <- map["id"]
    barberShopId <- map["barberShopId"]
    firstName <- map["firstName"]
    lastName <- map["lastName"]
    mobileNo <- map["mobileNo"]
    userName <- map["userName"]
    email <- map["email"]
    imgPath <- map["imgPath"]
    shopName <- map["shopName"]
    address <- map["address"]
    street <- map["street"]
    area <- map["area"]
    emirates <- map["emirates"]
    latitude <- map["latitude"]
    longitude <- map["longitude"]
    Services <- map["Services"]
    Stylist <- map["Stylist"]
    Availability <- map["Availability"]
    Facilities <- map["Facilities"]
}
}

Примечание. Когда я изменяю тип данных на Double? Это работает, но это добавляет дополнительные цифры из-за двойной.

Левая сторона - это моя разобранная модель, а правая - необработанное представление данных, полученных с сервера

Ссылка на json: http://shaveme.stagingserver-me.com/api/ShopUserMaster?ln=en&t=1F10D5778C66A751766E8532EEAA0E1B&uid=21

1 ответ

Решение

Это довольно сложно отладить, не имея доступа к фактическим данным. Я собрал небольшой тест ниже. Если вы запустите его, вы будете знать, что второй XCTAssertEqual в каждом тесте дает сбой, потому что исходные данные JSON не имеют кавычек вокруг значения 26.432. Я предполагаю, что ваши данные - это число, а не строка, и поэтому не будут правильно распределены.

import XCTest
import ObjectMapper

class Test : Mappable {
    var latitude: String?
    var longitude: String?

    required init?(map: Map) {

    }

    func mapping(map: Map) {
        latitude <- map["latitude"]
        longitude <- map["longitude"]
    }
}

class ObjectMapper_RndTests: XCTestCase {

    override func setUp() {
        super.setUp()
    }

    override func tearDown() {
        super.tearDown()
    }

    func testExample() {
        let json = "{\"longitude\": 26.432, \"latitude\":\"82.123\"}"
        let test = Test(JSONString: json);

        guard let t = test else {
            return
        }

        XCTAssertEqual(t.latitude, "82.123")
        XCTAssertEqual(t.longitude, "26.432")
    }

    func testExampleTwo() {
        let json = [ "longitude": 26.432, "latitude": "82.123" ] as [String : Any]
        let test = Test(JSON: json);

        guard let t = test else {
            return
        }

        XCTAssertEqual(t.latitude, "82.123")
        XCTAssertEqual(t.longitude, "26.432")
    }
}

Решение, если вы не можете изменить свой источник данных на String, это использовать преобразование. Больше информации на сайте ObjectMapper https://github.com/Hearst-DD/ObjectMapper. Похоже на это.

class Test : Mappable {
    var latitude: String?
    var longitude: String?

    required init?(map: Map) {

    }

    func mapping(map: Map) {

        let transform = TransformOf<String, Double>(fromJSON: { (value: Double?) -> String? in

            if let v = value {
                NSLog("from json value: " + String(v))
                return String(v)
            }
            NSLog("from json value: null")
            return nil
        }, toJSON: { (value: String?) -> Double? in
            // transform value from Double? to String?
            if let value = value {
                return Double(value)
            }
            return nil
        })

        latitude <- (map["latitude"], transform)
        longitude <- (map["longitude"], transform)
    }
}

Как вариант, вы можете сделать это вручную. Более чистые и короткие коды

class BarberLoginModel: Mappable {

    var latitude: Double?
    var longitude: Double?

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        var latitude: String?
        var  longitude: String?
        latitude <- map["latitude"]
        longitude <- map["longitude"]

        if let latitude = latitude {
            self.latitude = Double(string: latitude)
        }
        if let longitude = longitude {
            self.longitude = Double(string: longitude)
        }
    }
}
Другие вопросы по тегам