Как разобрать JSON и заполнить его в модели?
Это мой JSON
[
{
"_id": "58b517e8dd7fe4a90fcadc44",
"isActive": false,
"balance": "$1,293.72",
"picture": "http://placehold.it/32x32",
"age": 38,
"eyeColor": "brown",
"name": "Finch Hayes",
"gender": "male",
"company": "NIKUDA",
"email": "finchhayes@nikuda.com",
"phone": "+1 (874) 422-3921",
"address": "227 Trucklemans Lane, Steinhatchee, New Hampshire, 9835",
"about": "Veniam pariatur exercitation consequat exercitation dolore sint labore consequat enim cupidatat pariatur elit. Anim officia velit aliqua anim consectetur mollit aliquip occaecat duis non. Ea voluptate velit eu elit qui nulla aliquip.\r\n",
"friends": [
{
"id": 0,
"name": "Mooney Bond"
},
{
"id": 1,
"name": "Rosie Owen"
},
{
"id": 2,
"name": "Melanie Brown"
}
]
},
{
"_id": "58b517e8b53b162133de0013",
"isActive": true,
"balance": "$2,637.14",
"picture": "http://placehold.it/32x32",
"age": 29,
"eyeColor": "green",
"name": "Terry Conway",
"gender": "male",
"company": "MEDALERT",
"email": "terryconway@medalert.com",
"phone": "+1 (856) 436-2212",
"address": "904 Carlton Avenue, Carrizo, Nevada, 9560",
"about": "Aute duis esse enim sit occaecat veniam aute sunt esse. Quis consequat dolore veniam reprehenderit laborum. Labore quis magna cillum consequat laborum amet in amet proident sit.\r\n",
"friends": [
{
"id": 0,
"name": "Sparks Baxter"
},
{
"id": 1,
"name": "Carrillo Gonzales"
},
{
"id": 2,
"name": "Hebert Montgomery"
}
]
}]
Я уже создаю объект person и personFriend. ниже это мой main.m
NSError *error;
NSString *url_string = [NSString stringWithFormat:@"http://danialm.weebly.com/uploads/1/0/1/5/101578472/people.json"];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:url_string]];
id personJson = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
//NSLog(@"item: %@", personJson);
NSMutableArray *personArray = [[NSMutableArray alloc]init];
NSMutableArray *friendArray = [[NSMutableArray alloc]init];
for (NSDictionary *personInfoDict in personJson) {
Person *person = [[Person alloc] init];
person.personId = [personInfoDict objectForKey:@"_id"];
person.about = [personInfoDict objectForKey:@"about"];
person.address = [personInfoDict objectForKey:@"address"];
person.age = [[personInfoDict objectForKey:@"age"] doubleValue];
person.balance = [personInfoDict objectForKey:@"balance"];
person.company = [personInfoDict objectForKey:@"company"];
person.email = [personInfoDict objectForKey:@"email"];
person.eyeColor = [personInfoDict objectForKey:@"eyeColor"];
person.gender = [personInfoDict objectForKey:@"gender"];
person.isActive = [[personInfoDict objectForKey:@"isActive"]boolValue];
person.name = [personInfoDict objectForKey:@"name"];
person.phone = [personInfoDict objectForKey:@"phone"];
person.picture = [personInfoDict objectForKey:@"picture"];
person.friends = [personInfoDict objectForKey:@"friends"];
for (NSDictionary *friendInfoDict in personInfoDict) {
PersonFriends *friend = [[PersonFriends alloc]init];
friend.friendsId = [[friendInfoDict objectForKey:@"id"]doubleValue];
friend.name = [friendInfoDict objectForKey:@"name"];
[friendArray addObject: friend];
}
[personArray addObject:person];
[personArray addObject:friendArray];
}
NSLog(@"personArray: %@", personArray);
Я не могу понять, как разобрать JSON и заполнить его в модели. Это правильный путь или неправильный, потому что я все еще новичок в разработке цели.
2 ответа
По большей части это выглядит хорошо. Пара вопросов:
- Вы должны двигаться
NSMutableArray *friendArray = [[NSMutableArray alloc]init];
внутри вашего первого цикла for, непосредственно перед вашим вторым циклом for, где вы создаете объекты-друзья. Это потому, что у каждого человека есть свой список друзей, поэтому вам нужно создать новый массив. for (NSDictionary *friendInfoDict in personInfoDict)
должно бытьfor (NSDictionary *friendInfoDict in [personInfoDict objectForKey:@"friends"])
, В противном случае вы попытаетесь создать друга для каждого человека.person.friends = [personInfoDict objectForKey:@"friends"];
должно бытьperson.friends = friendArray;
, и следует перейти к после цикла ваших друзей.- Вам не нужно
[personArray addObject:friendArray];
, так как у каждого объекта person уже должен быть массив друзей.
Кроме того, меньше проблем, и больше для читабельности кода - но стоит переместить большую часть этого кода в ваши объекты Person и PersonFriend. Таким образом, ваш цикл становится:
for (NSDictionary *personInfoDict in personJson) {
Person *person = [[Person alloc] initWithDictionary:personInfoDict];
[personArray addObject:person];
}
И в твоей Личности initWithDictionary
у вас будет весь этот код:
- (instancetype)initWithDictionary:(NSDictionary *)personInfoDict {
if (self = [super init]) {
self.personId = [personInfoDict objectForKey:@"_id"];
NSMutableArray *friendArray = [[NSMutableArray alloc]init];
for (NSDictionary *friendInfoDict in [personInfoDict objectForKey:@"friends"]) {
PersonFriends *friend = [[PersonFriends alloc]initWithDictionary:friendInfoDict];
[friendArray addObject: friend];
}
...etc
}
return self;
}
Редактировать: чтобы найти конкретного человека, вы можете написать вспомогательный метод, чтобы пройтись по массиву персон и вернуть человека с заданным идентификатором (например, можете использовать имя и т. Д.):
- (Person *)personWithId:(NSString *)id {
for (Person *person in self.personArray) {
if ([person.id isEqualToString:id]) {
return person;`
}
}
return nil;
}
Хотя вам нужно будет либо передать свой personArray, либо сделать его свойством, чтобы ваш вспомогательный метод мог получить к нему доступ (вероятно, лучше всего сделать его свойством).
Вам следует выбрать приложение JSONAccelerator для iOS, которое очень просто в использовании. С помощью которого вы можете проанализировать и создать модель в течение нескольких секунд.