Swift - «Ожидается декодировать массив <Any>, но вместо него найден словарь». - PullRequest
0 голосов
/ 05 ноября 2018

У меня много проблем при попытке расшифровать это JSON с помощью Swift 4.2:

{
    token = a3253e6ade9b5c7fd99673938bb28b3e;
    user =     {
        "about_me" = Admin;
        address = "";
        "banner_path" = "http://members.sharjahcd.ae/images/000/000/008/1540737652129.jpg?1541043871";
        company = "<null>";
        description = "<null>";
        email = "admin@stf.com";
        "events_count" = 0;
        "followers_count" = 0;
        "following_count" = 0;
        id = 2;
        "image_path" = "http://members.sharjahcd.ae/images/000/000/009/1540737834886.jpg?1541043896";
        "is_admin" = 1;
        major = "";
        "my_post_count" = 5;
        name = "Admin MemberPortal";
        "non_business_email" = "<null>";
        passedout = "";
        "phone_number" = 000000000;
        photos =         (
            "http://members.sharjahcd.ae/images/000/000/004/IMG_20181029_150700.jpg?1540805844",
            "http://members.sharjahcd.ae/images/000/000/012/20181028_173702.jpg?1541126171",
            "http://members.sharjahcd.ae/images/000/000/011/20181028_173703.jpg?1541126151",
            "http://members.sharjahcd.ae/images/000/000/010/20181028_173705.jpg?1541126144"
        );
        position = "<null>";
        role = Admin;
        stars = 3;
        "total_membership_points" = 0;
    };
}

Вот как я пытаюсь его расшифровать

let UserDatas = try JSONDecoder().decode(Token.self, from: data)
  print("response : \(UserDatas)")


struct Token: Decodable {
    let token: String
    let user: [Response]
}

struct Response: Decodable {
    let about_me: String
    let address: String
    let company: String
    let description: String
    let email: String
    let events_count: Int
    let followers_count: Int
    let following_count: Int
    let id = Int()
    let image_path: String
    let is_admin: String
    let major: String
    let my_post_count: Int
    let name: String
    let non_business_email: String
    let passedout: String
    let phone_number: Int
    let photos: [String]
    let position: String
    let role: String
    let stars: Int
    let total_membership_points: Int
}

Он не работает и получил следующую ошибку:

typeMismatch (Swift. ))

Как мне создать структуру, которая будет декодировать этот JSON?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Вы также можете использовать CodingKey.

struct Landmark: Codable {
    var name: String
    var foundingYear: Int
    var location: Coordinate
    var vantagePoints: [Coordinate]

    enum CodingKeys: String, CodingKey {
        case name = "title"
        case foundingYear = "founding_date"

        case location
        case vantagePoints
    }
}

См .: Кодирование и декодирование пользовательских типов

0 голосов
/ 05 ноября 2018

В вашем JSON пользовательское свойство не является массивом, но вы объявили его как массив ([Response]) в своем коде. Измените свой код на:

struct Token: Decodable {
    let token: String
    let user: Response
}

Кроме того, если в вашем коде объявлены какие-либо свойства, которые являются нулевыми или отсутствуют в вашем JSON, вы должны сделать их необязательными.

В вашем JSON компания выглядит нулевой, поэтому измените

let company: String

до

let company: String?

И сделать то же самое для других свойств, которые могут быть нулевыми или отсутствующими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...