异常 '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
仅接受 NSArray
、NSDictionary
、NSString
、NSNumber
(和 NSNull
)作为其顶级,但是所有sublevels/subproperties也是。
myArray
是 AVBase
的 NSArray,而 AVBase
不是其中之一。
您需要先将 AVBase
转换为 NSDictionary
。
-(NSDictionary *)toDict {
return @{@"portName": portName, @"uid": uid, @"port": port};
}
然后:
[myArray addObject:[av toDict]];
如果你不使用AVBase
,或者只是为了它,你可以直接从AVAudioSessionPortDescription *output
构造NSDictionary
,这里不需要使用AVBase
.
我有一个如下所示的界面:#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
仅接受 NSArray
、NSDictionary
、NSString
、NSNumber
(和 NSNull
)作为其顶级,但是所有sublevels/subproperties也是。
myArray
是 AVBase
的 NSArray,而 AVBase
不是其中之一。
您需要先将 AVBase
转换为 NSDictionary
。
-(NSDictionary *)toDict {
return @{@"portName": portName, @"uid": uid, @"port": port};
}
然后:
[myArray addObject:[av toDict]];
如果你不使用AVBase
,或者只是为了它,你可以直接从AVAudioSessionPortDescription *output
构造NSDictionary
,这里不需要使用AVBase
.