【问题标题】:JSON parse to Core Data works, but I get null objectsJSON解析到Core Data有效,但我得到空对象
【发布时间】:2012-09-02 14:39:05
【问题描述】:

我在尝试将 JSON 保存到 Core Data 时遇到的问题是,我在列表视图中获得了空对象,而不是让它们填充数据。这是我的 JSON 格式:

[{"nid":"23","name":"JN01"},{"nid":"24","name":"JN02"}]

这是我的代码

jsonToArray.h

#define JSON_NAME @"name"
#define JSON_NID @"nid"
@interface JSONToArray : NSObject
@property (nonatomic, copy) NSString *nid;
@property (nonatomic, copy) NSString *name;
+ (void)showNetworkError:(NSString *)theMessage;
+ (NSArray*)retrieveJSONItems;

jsonToArray.m

+ (NSArray*)retrieveJSONItems { //skipped a few boring lines
NSArray *json = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfURL:url]
                                                options:kNilOptions
                                                  error:&err];
return json;}

Job+Json.h //Job- my entity

+ (Job *)appsWithJSONInfo:(NSDictionary *) nbJSONInfo
inManagedObjectContext:(NSManagedObjectContext *)context;
+ (Job *)appsWithID:(NSString *)newID inManagedObjectContext:(NSManagedObjectContext *)context;

Job+Json.m

#import "Apps+JSON.h"
#import "JSONToArray.h"

@implementation Job (JSON)

+ (Job *)appsWithJSONInfo:(NSDictionary *) nbJSONInfo
inManagedObjectContext:(NSManagedObjectContext *)context {

Job *apps = nil;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Job"];
request.predicate = [NSPredicate predicateWithFormat:@"nid=%@", [nbJSONInfo objectForKey:JSON_NID]];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;
NSArray *matches = [context executeFetchRequest:request error:&error];

if (!matches || ([matches count] > 1)) {
    [JSONToArray showNetworkError:@"There was an error retrieving the json Data."];
} else if ([matches count] == 0) {
    apps = [NSEntityDescription insertNewObjectForEntityForName:@"Job" inManagedObjectContext:context];
    apps.nid = NSLocalizedString([nbJSONInfo objectForKey:JSON_NID], nil);
    apps.name = NSLocalizedString([nbJSONInfo objectForKey:JSON_NAME], nil);



}else {
    apps = [matches lastObject];
}

return apps;
}

+ (Job *)appsWithID:(NSString *)newID
            inManagedObjectContext:(NSManagedObjectContext *)context
{
Job *app = nil;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Job"];
request.predicate = [NSPredicate predicateWithFormat:@"nid = %@", newID];
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

NSError *error = nil;
NSArray *apps = [context executeFetchRequest:request error:&error];

if ([apps count] == 0) {
    app = [NSEntityDescription insertNewObjectForEntityForName:@"Job"
                                        inManagedObjectContext:context];
    app.nid = NSLocalizedString(newID, nil);
} else if ([apps count] >=1) {   
    app = [apps lastObject];
}
return app;
}

最后是我的列表视图:

- (void)viewWillAppear:(BOOL)animated{
[self fetchJSONDataIntoDocument:self.managedObjectContext];}

- (void)fetchJSONDataIntoDocument:(NSManagedObjectContext *)managedObjectContext{    
NSArray * tempArray = [JSONToArray retrieveJSONItems];
for (NSDictionary *JSONInfo in tempArray) {
[Job appsWithJSONInfo:JSONInfo inManagedObjectContext:managedObjectContext];

}

NSError *error = nil;
if (![managedObjectContext save:&error]) {
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}
}

所以在这种情况下,我在列表视图中看到了这两个对象,但它们为空,没有任何值。我该如何解决?

【问题讨论】:

  • 您是否尝试过使用调试器单步执行每一行?这可能有助于缩小哪些部分/行没有按照您的预期进行......哪些行在您期望不同的地方得到一个 nil 对象?
  • 我建议您使用RestKit。将 JSON 映射到 CoreData 对象真的很容易。

标签: ios parsing core-data json


【解决方案1】:
  • 您是否正在为 > IOS5.0 进行开发?

  • 我使用 NSJSONReadingMutableLeaves 而不是 kNilOptions

    [NSJSONSerialization JSONObjectWithData:returnData 选项:NSJSONReadingMutableLeaves 错误:&error];

【讨论】:

  • 是的,它适用于 iOS 5+。结果还是一样。
  • 如果你记录你的 JSON,你可以看到里面的值?
  • 是的...{ name = "JN01"; nid = 23; },{名称=“JN02”; nid = 24; }
  • 代替 NSArray *tempArray = [JSONToArray retrieveJSONItems] 尝试 NSArray *tempArray = [NSArray alloc] initWithArray:[JSONToArray retrieveJSONItems]]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 2016-12-02
  • 2022-01-23
  • 1970-01-01
  • 2020-04-11
  • 2021-08-06
  • 2017-02-25
相关资源
最近更新 更多