异常 'JSON 中的无效类型写入

Exception 'Invalid type in JSON write

我有一个如下所示的界面:#import

#import <AVFoundation/AVFoundation.h>

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:&error];

但是当我尝试序列化 myArray 时,我收到一条错误消息:

Exception 'Invalid type in JSON write (AVBase)

我不明白怎么了,我的 class 中的所有属性都是 NSString 类型,所以它应该可以工作。

NSJSONSerialization 仅接受 NSArrayNSDictionaryNSStringNSNumber(和 NSNull)作为其顶级,但是所有sublevels/subproperties也是。

myArrayAVBase 的 NSArray,而 AVBase 不是其中之一。 您需要先将 AVBase 转换为 NSDictionary

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

然后:

[myArray addObject:[av toDict]];

如果你不使用AVBase,或者只是为了它,你可以直接从AVAudioSessionPortDescription *output构造NSDictionary,这里不需要使用AVBase .