Я использую ABAddressBookCreateWithOptions и ABAddressBookCopyArrayOfAllPeople для получения информации обо всех контактах.

Я могу получить полное имя человека, адреса электронной почты и номера телефонов, например:

addressBook = ABAddressBookCreateWithOptions(NULL, NULL);
people = ABAddressBookCopyArrayOfAllPeople(addressBook);

for (CFIndex i = 0; i < CFArrayGetCount(people); i++)
{
  ABRecordRef person = CFArrayGetValueAtIndex(people, i);


  ////get full name////
  NSString *fullname = @"";
  if (ABRecordCopyValue(person, kABPersonFirstNameProperty)!=NULL){
      fullname = [NSString stringWithFormat:@"%@ ", ABRecordCopyValue(person, kABPersonFirstNameProperty)];
  }
  if (ABRecordCopyValue(person, kABPersonMiddleNameProperty)!=NULL){
      fullname = [NSString stringWithFormat:@"%@%@ ", fullname,ABRecordCopyValue(person, kABPersonMiddleNameProperty)];
  }
  if (ABRecordCopyValue(person, kABPersonLastNameProperty)!=NULL){
      fullname = [NSString stringWithFormat:@"%@%@", fullname,ABRecordCopyValue(person, kABPersonLastNameProperty)];
  }
  fullname = [fullname stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
  NSLog(@"fullname: %@",fullname);



  ////get phone numbers////
  ABMultiValueRef phonenumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
  if (ABMultiValueGetCount(phonenumbers)>0)
  {
      for (CFIndex j=0; j < ABMultiValueGetCount(phonenumbers); j++)
      {
          NSString *phonenumber = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(phonenumbers, j));
          NSLog(@"phone number: %@",phonenumber);
      }
  }
  CFRelease(phonenumbers);



  ////get emails////
  ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
  if (ABMultiValueGetCount(emails)>0)
  {
      for (CFIndex j=0; j < ABMultiValueGetCount(emails); j++)
      {
          NSString *email = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(emails, j));
          NSLog(@"email: %@",email);
      }
  }
  CFRelease(emails);
}     

CFRelease(addressBook);
CFRelease(people);         

Все работает отлично. Но мне нужно создать объект JSON с такой информацией:

[{"name":"Christine Work","phone_numbers":["+99023424234"]},{"name":"Alex Bla","phone_numbers":["+135352125262","+13433452347"],"email_addresses":["bla@bla.com","bla2@bla2.com"]}]

Сценарий : если у человека есть адрес электронной почты, добавьте его в объект json, если нет, не вставляйте его в json.

Если у человека более одного номера телефона или более одного адреса электронной почты, добавьте их все в json.

Я застрял здесь. Я знаю, как создать объект json с помощью NSDictionary:

NSError *error;
NSDictionary* info = [NSDictionary dictionaryWithObjectsAndKeys:
                                  @"alex", @"name",
                                  @"+90225252", @"phones",
                                  nil];

NSData* jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
NSString *jsonString = [[NSString alloc] initWithData:info encoding:NSUTF8StringEncoding];

Но как я могу интегрировать этот код в свой сценарий в цикле.

0
woheras 10 Апр 2014 в 05:23

2 ответа

Лучший ответ

Попробуйте. Добавлен необходимый код для создания JSON поверх вашего кода. Если для контакта нет телефонных номеров или адресов электронной почты, для этого ключа добавляется NSNull. Обязательно проверьте его, когда вы извлекаете данные из JSON. Не создавал код, поэтому дайте мне знать, если у вас возникнут какие-либо ошибки.

NSMutableArray *usersArray = [[NSMutableArray alloc] init];
NSMutableDictionary *singleUserDictionary = [[NSMutableDictionary alloc] init];
NSMutableArray *phoneNumbersArray = [[NSMutableArray alloc] init];
NSMutableArray *emailArray = [[NSMutableArray alloc] init];

for (CFIndex i = 0; i < CFArrayGetCount(people); i++) {
        ABRecordRef person = CFArrayGetValueAtIndex(people, i);

    ////get full name////
    NSString *fullname = @"";
    if (ABRecordCopyValue(person, kABPersonFirstNameProperty)!=NULL){
        fullname = [NSString stringWithFormat:@"%@ ", ABRecordCopyValue(person, kABPersonFirstNameProperty)];
    }
    if (ABRecordCopyValue(person, kABPersonMiddleNameProperty)!=NULL){
        fullname = [NSString stringWithFormat:@"%@%@ ", fullname,ABRecordCopyValue(person, kABPersonMiddleNameProperty)];
    }
    if (ABRecordCopyValue(person, kABPersonLastNameProperty)!=NULL){
        fullname = [NSString stringWithFormat:@"%@%@", fullname,ABRecordCopyValue(person, kABPersonLastNameProperty)];
    }
    fullname = [fullname stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
    NSLog(@"fullname: %@",fullname);
    [singleUserDictionary setObject:fullname forKey:@"name"];


    ////get phone numbers////
    ABMultiValueRef phonenumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);
    if (ABMultiValueGetCount(phonenumbers)>0)
    {
        for (CFIndex j=0; j < ABMultiValueGetCount(phonenumbers); j++)
        {
            NSString *phonenumber = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(phonenumbers, j));
            NSLog(@"phone number: %@",phonenumber);
            [phoneNumbersArray addObject:phonenumber];
        }
    }
    else
        [phoneNumbersArray addObject:[NSNull null]];
    [singleUserDictionary setObject:phoneNumbersArray forKey:@"phone_numbers"];

    CFRelease(phonenumbers);


    ////get emails////
    ABMultiValueRef emails = ABRecordCopyValue(person, kABPersonEmailProperty);
    if (ABMultiValueGetCount(emails)>0)
    {
        for (CFIndex j=0; j < ABMultiValueGetCount(emails); j++)
        {
            NSString *email = (NSString*)CFBridgingRelease(ABMultiValueCopyValueAtIndex(emails, j));
            NSLog(@"email: %@",email);
            [emailArray addObject:email];
        }
    }
    else
        [emailArray addObject:[NSNull null]];
    [singleUserDictionary setObject:emailArray forKey:@"email_addresses"];
    CFRelease(emails);

    [usersArray addObject:[NSDictionary dictionaryWithDictionary:singleUserDictionary]];
    [singleUserDictionary removeAllObjects];
    [phoneNumbersArray removeAllObjects];
    [emailArray removeAllObjects];
}

NSError *error = nil;
NSData *data = [NSJSONSerialization dataWithJSONObject:usersArray options:0 error:&error];

if (error) {
    //json success
}

CFRelease(addressBook);
CFRelease(people);
3
Inertiatic 10 Апр 2014 в 02:53

Псевдокод:

Создайте внешний NSMutableArray.

Для каждого человека -

  • создать NSMutableDictionary
  • вставить имя
  • создать NSMutableArray и вставить в него номера телефонов
  • вставить массив в словарь как "phone_numbers"
  • повторить для адресов электронной почты (если есть)
  • вставить словарь в массив

Запустите внешний массив через NSJSONSerialization для сериализации в объект NSData

1
Hot Licks 10 Апр 2014 в 01:55