奇怪的是,似乎没有任何公共方法来序列化数组,但它显然可以在序列化数组属性时执行.我有一个带有数组属性的JSONModel继承类.我想获得该属性的JSON文本表示,而不是整个对象.
我不介意修改源代码,但是首先要了解哪些内容.
另一个想法是将每个对象单独序列化为JSON并将它们包装在中[,].
我正在使用JSONModel从URL获取JSON.这是一个非常简单的对象,只包含2个字符串 - "name"和"url".
首先我制作了对象模型:
@protocol
Tutorial
@end
@interface Tutorial : JSONModel
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *url;
@end
Run Code Online (Sandbox Code Playgroud)
然后对象Feed:
#import "JSONModel.h"
#import "Tutorial.h"
@interface TutorialFeed : JSONModel
@property (nonatomic, strong) NSArray <Tutorial> *tutorials;
@end
Run Code Online (Sandbox Code Playgroud)
然后在MasterViewController.m中:
#import "MasterViewController.h"
#import "DetailViewController.h"
#import "TutorialFeed.h"
#import "JSONModelLib.h"
@interface MasterViewController () {
TutorialFeed *feed;
TutorialFeed *testFeed;
}
@end
@implementation MasterViewController
-(void)viewDidAppear:(BOOL)animated
{
feed = [[TutorialFeed alloc]
initFromURLWithString:@"http://api.matematikfessor.dk/apps/teacher_videos"
completion:^(JSONModel *model, JSONModelError *err) {
NSLog(@"Tutorials %@", feed.tutorials);
}];
}
@end
Run Code Online (Sandbox Code Playgroud)
问题是,我在日志中返回nil :(我不知道为什么会发生这种情况,因为我设法从这个URL获取JSON数据: Kiwa …
我在我的iOS应用程序中使用JSONModel,我正面临一些警告,让我自己解释一下.
假设我有这个JSONModel
CTVContact.h
@interface CTVContact : JSONModel
@property (nonatomic, strong) NSArray<Optional, CTVPhone> *phone;
@end
Run Code Online (Sandbox Code Playgroud)
CTVContact.m
NSMutableArray *phones = [[NSMutableArray alloc] init];
for(NSString *p in personPhones) {
CTVPhone *phn = [[CTVPhone alloc] init];
phn.original = p;
[phones addObject:phn];
}
phone = [NSArray arrayWithArray:phones];
Run Code Online (Sandbox Code Playgroud)
基本上它都像一个魅力,但我得到一个警告,说明以下内容:
Incompatible pointer types assigning to 'NSArray<Optional,CTVEventParticipant> *' from 'NSArray *'
Run Code Online (Sandbox Code Playgroud)
我怎么能绕过那个警告?在没有该警告的情况下,我找不到将所有数组值分配给手机阵列的正确方法.
非常感谢提前!
不明白为什么我的NSString数据为空.
我试图从我的应用程序解析json网站上的数字字符串.它成功运行,但是当我试图在我的视图控制器中显示该数字时,它读取为null.我将发布一个示例代码供大家更好地理解.
Handler.m
JsonModel *jsonModel =[[JsonModel alloc]init];
jsonModel.idNumber = [jsonDict valueForKey:@"id"];
nslog(@"%@",jsonModel.idNumber);
Run Code Online (Sandbox Code Playgroud)
JsonModel.h
#import <Foundation/Foundation.h>
@interface JsonModelModel : NSObject
@property (nonatomic, strong) NSString *idNumber;
Run Code Online (Sandbox Code Playgroud)
JsonModel.m
#import "JsonModel.h"
@implementation JsonModel
@synthesize idNumber;
Run Code Online (Sandbox Code Playgroud)
这部分工作成功,我能够解析必要的数据并NSLog证明它.但是,这就出现了问题.PS idNumber是NSString.
ViewController.m
-(void)method{
JsonModel *jsonModel =[[JsonModel alloc]init];
NSLog(@"%@",jsonModel.idNumber);
}
Run Code Online (Sandbox Code Playgroud)
由于某种原因,NSLog显示为null.即使首先解析了json数据,然后调用视图控制器中的方法.我必须缺少一些小细节.如果有人帮我搞清楚,我会很感激.
在我的旧Obj-C代码中,我可以声明一个字典,其值是Class其他类的类型
NSMutableDictionary *Methods = [[NSMutableDictionary alloc] init];
[Methods setObject:[AuthReturnValue class] forKey:@"Authenticate"];
[Methods setObject:[MyOptions class] forKey:@"GetOptions"];
Run Code Online (Sandbox Code Playgroud)
之后,基于密钥,我可以将其分配Class给另一个变量
(在标题中)
Class returnType;
Run Code Online (Sandbox Code Playgroud)
(在实施中):
returnType = (Class)[Methods objectForKey:methodName];
Run Code Online (Sandbox Code Playgroud)
然后我可以使用这个Class变量声明一个相同类型的新变量(在这种情况下,它使用JSONModel并使用NSDictionary其他地方初始化它)
id<NSObject> result;
result = [[returnType alloc] initWithDictionary:(NSDictionary *)responseObject error:NULL];
Run Code Online (Sandbox Code Playgroud)
这很好,很方便,因为JSONModel实现了initWithDictionary,这意味着我可以通过Class这种方式拉入,而无需实例化特定类型.
我无法弄清楚如何在Swift中做到这一点.
例如,这不起作用:
var result: self.returnType.self()
var result: AnyClass = self.returnType.self
Run Code Online (Sandbox Code Playgroud)
还有几十个变种.
如何将Swift中的变量声明为对象中的class定义AnyClass?或者我这样做是错的?
这是一个新手问题.我有一个看起来像下面的对象(例如MyObject.h).
#import <Foundation/Foundation.h>
#import "JSONModel.h"
@protocol MyObject
@end
@interface MyObject : JSONModel
@property (strong,nonatomic) NSString* name;
@end
Run Code Online (Sandbox Code Playgroud)
实现如下(例如MyObject.m).
#import "MyObject.h"
@implementation MyObject
@end
Run Code Online (Sandbox Code Playgroud)
在我的其他地方的代码中,我然后定义NSMutableArray如下.
NSMutableArray<MyObject>* list;
list = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)
我收到了这个警告.
不兼容的指针类型从'NSMutableArray ' 分配'NSMutableArray <MyObject> '
我知道泛型不支持Objective-C开箱即用(这也不是我在这里要做的),但我NSMutableArray的定义是这样的协议,MyObject因为我试图关注"JSONModel"的GitHub页面中的示例.
代码仍在编译,但上面有警告.我如何能
NSMutableArray正确分配/初始化?更新:
我继续搜索如何摆脱这个警告,事实证明,如果我创建一个NSMutableArray像下面这样的警告消失(并且项目编译没有错误).我将编写一个单元测试,看它是否按预期工作.
list = (id)[NSMutableArray new];
Run Code Online (Sandbox Code Playgroud)