Исключение «Недопустимый тип в записи в формате JSON

#ios #objective-c

Вопрос:

У меня есть интерфейс, который выглядит следующим образом: #импорт lt;Foundation/Foundation.hgt;

 #import lt;AVFoundation/AVFoundation.hgt;  NS_ASSUME_NONNULL_BEGIN  @interface AVBase : NSObject  @property NSString *portName;  @property NSString *uid;  @property NSString* port;  - (id) initWithPortName:(NSString *)portName andUID:(NSString *)uid andPort:(AVAudioSessionPort)port; @end  NS_ASSUME_NONNULL_END  

и .m файл

 @implementation AVBase - (id)initWithPortName:(NSString *)portName andUID:(NSString *)uid andPort:(AVAudioSessionPort)port {  self = [super init];  if (self)  {  self.portName = portName;  self.uid = uid;  self.port = [port description];  }  return self; } @end  

Я хочу создать массив текущих выходов для сеанса AVAudioSession, поэтому я делаю это так:

 NSMutableArray *myArray = [[NSMutableArray alloc] init];  AVAudioSession *session = AVAudioSession.sharedInstance;  NSArray *outputs = [[session currentRoute] outputs];  for(AVAudioSessionPortDescription* output in outputs)  {  AVBase* av = [AVBase alloc];  av = [av initWithPortNumber:output.portName andUID:output.UID andPort:output.portType];  [myArray addObject:av];  }  NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:amp;error];  

Но когда я пытаюсь сериализовать myArray , я получаю сообщение об ошибке, в котором говорится:

 Exception 'Invalid type in JSON write (AVBase)  

Я не понимаю, в чем дело, все свойства в моем классе имеют тип NSString , поэтому он должен работать.

Ответ №1:

NSJSONSerialization принимает только NSArray , NSDictionary , NSString , NSNumber NSNull ) для своего верхнего уровня, но также и все подуровни/подпроекты.

myArray является одним из множества AVBase , и AVBase не является одним из них. Вам нужно сначала преобразовать an AVBase в a NSDictionary .

 -(NSDictionary *)toDict {  return @{@"portName": portName, @"uid": uid, @"port": port}; }  

Затем:

 [myArray addObject:[av toDict]];  

Если вы не используете AVBase или просто для этого , вы можете создать NSDictionary непосредственно из AVAudioSessionPortDescription *output , не нужно использовать AVBase здесь.