Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Недопустимый тип при записи JSON (NSConcreteValue) - PullRequest
0 голосов
/ 19 июня 2019

Это мой словарь:

 { @"RoutePolyline":<__NSArrayM 0x283983750>(<c59272f7 39263940      55a4c2d8 42f65240>),
    @"RideID":6565
};

Я отправляю этот словарь в качестве аргумента в моем вызове API.

и мое приложение вылетает по этой строке кода:

 NSData *postData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];

Это ошибка, которую он выдает:

Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Неверный тип в записи JSON (NSConcreteValue)»

Я знаю, что параметр RoutePolyline содержит NSValue (предполагается, что это массив координат), а не объект любого типа, но я попытался преобразовать много, но пока ничего не получалось.Например

[NSValue valueWithMKCoordinate:*routeCoordinates]

Ответы [ 2 ]

2 голосов
/ 19 июня 2019

Переберите массив NSValue и извлеките значение CLLocationCoordinate2D.

for (NSValue *value in coordinates) {
    CLLocationCoordinate2D coordinate;
    [value getValue:&coordinate];
    NSDictionary *coDic = @{@"latitude" : [NSNumber numberWithDouble: coordinate.latitude],
                            @"longitude": [NSNumber numberWithDouble: coordinate.longitude]};
    [array addObject:coDic];
}

Также проверьте правильность словаря JSON перед сериализацией

if ([NSJSONSerialization isValidJSONObject:dic]) {
    NSData *postData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error];
}
0 голосов
/ 19 июня 2019

Сначала получите значения координат (lat longs) и сохраните их в массиве, затем вы можете его сериализовать, он не должен падать.Попробуйте использовать NSString значения в API:

NSArray *arr = @[ @{@“lat”: [NSString stringWithFormat:@"%ld",routeCoordinates.latitude],
                    @“long”:[NSString stringWithFormat:@"%ld",routeCoordinates.longitude]
                }];
...