84

Can anyone tell me how to convert an NSArray to an NSData? I have an NSArray. I need to send it to an NSInputStream. In order to do that I need to convert the NSArray to an NSData.

Please help me, I'm stuck here.

Kuldeep
  • 4,466
  • 8
  • 32
  • 59
satish
  • 1,245
  • 3
  • 14
  • 15

7 Answers7

194

Use NSKeyedArchiver (which is the last sentence of the post Garrett links):

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];

Note that all the objects in array must conform to the NSCoding protocol. If these are custom objects, then that means you need to read up on Encoding and Decoding Objects.

Note that this will create a fairly hard-to-read property list format, but can handle a very wide range of objects. If you have a very simple array (strings for instance), you may want to use NSPropertyListSerialization, which creates a bit simpler property list:

NSString *error;
NSData *data = [NSPropertyListSerialization dataFromPropertyList:array format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error];

There's also an XML format constant you can pass if you'd rather it be readable on the wire.

Pang
  • 9,564
  • 146
  • 81
  • 122
Rob Napier
  • 286,113
  • 34
  • 456
  • 610
94

On a somewhat related note, here's how you would convert the NSData back to an NSArray:

NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data]
Michael Thiel
  • 2,434
  • 23
  • 21
  • 5
    Make sure that it's NSKeyedUnarchiver and not NSKeyedArchiver. Can be an easy mistake to make when using auto complete. – Sean Nov 05 '13 at 16:58
  • 2
    This answer, coupled with the chosen answer from above should be sufficient to archive/unarchive any compatible object to/from NSData – Scott D Nov 05 '14 at 18:08
3

I used this code.

 NSError *error;
 NSMutableData *jsonData = [[NSJSONSerialization dataWithJSONObject:yourDemoArray
                                                                   options:0 // Pass 0 if you don't care about the readability of the generated string
                                                                     error:&error] copy];
Avijit Nagare
  • 8,482
  • 7
  • 39
  • 68
2

Swift :

let data = NSKeyedArchiver.archivedData(withRootObject: jsonArray)
print(data)
ioopl
  • 1,735
  • 19
  • 19
1

You can do this-

NSArray *array= [NSArray array];
NSData *dataArray = [NSKeyedArchiver archivedDataWithRootObject:array];
Nitesh
  • 1,389
  • 1
  • 15
  • 24
1

In iOS 9+ use this please:

NSArray *array = [[NSArray alloc] init];
NSData *data = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListBinaryFormat_v1_0 options:0 error:nil];

The older version of this was deprecated in iOS 8.

NeilNie
  • 1,050
  • 11
  • 25
0

Swift 5

let data = try! NSKeyedArchiver.archivedData(withRootObject: array, requiringSecureCoding: true)
alex
  • 1