Parsing large quantities of JSON data in iOS - iphone

I'm getting a large JSON string (11MB) from a web service. When I parse the data using JSONKit, my app reaches 70MB, I get memory warnings, and the app crashes.
How can I parse this data?

the easiest solution is reducing the json size you are getting from the server. If you cant to it, the only way to parse huge JSON is using lazy evaluation.
I dont think there is a JSON lib for objective-c that supports lazy evaluation. however you can implement one.

Your best bet is to look at the YAJL JSON parser, that supports event driven parsing. Then you can parse the JSON as it comes down in a data feed, and not have to store the whole thing in memory at once.
https://github.com/gabriel/yajl-objc
Sorry, I don't know of any code examples that demonstrate this use in practice.

SBJson supports parsing a stream of data. This lets your process your document bit by bit so you don't need to hold on to the entire document. The distribution contains two examples of how to use this. First there's the StreamParserIntegrationTest.m and next there's the TweetStream demo app: a twitter application that will sit and parse a HTTP stream all day (if you let it) displaying each tweet as they come in and then throw them away.
(Disclaimer: I am SBJson's author.)

11 mb is a largedata and solution is only to minimise your size of data
JSON support is not native to iOS, but there is a great framework for this exact purpose: http://code.google.com/p/json-framework/
This framework supports conversion from raw JSON objects to Objective-C objects (NSArray, NSDictionary) and vice versa.

Related

iPhone : Which type of parser recommended for data parsing between iPhone and web-service?

Can any body tell me which parser is best in my condition? XML, JSON or any else ?
The app contains feature link sync the data, communicate with the web-service and etc. So I am targeting parser which is light weight and fast.
I have lots of data which are parsed between iPhone and server.
Which are the option? Or any good link for comparison between different parser ?
I would suggest JSON as in terms of data size json tends to be compact compared to XML. Which will reduce time spent in network transfer (for your data).
You could use any available JSON parsers to directly get ObjectiveC objects. Some Json parsers -
NSJSONSerialization
json framework
jsonKit
I personally prefer jsonKit as its supposed to be fastest of all.
Of course it's JSON.
This is the frequent question asked on stack.You could find much better answer just by Goggling.
JSON has several advantages over XML. Its a lot smaller and less bloated, so you will be passing much less data over the network - which in the case of a mobile device will make a considerable difference.
Refer to JSON Tutorial for iPhone.
Mr.Devang. I recommend NSXMLParser. If your data or response from service will be in XML format please use NSXMLParser. Apple have inbuilt xml parsing tool. Please refere Apple document fir NSXMLParser,
http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSXMLParser_Class/Reference/Reference.html
http://developer.apple.com/library/mac/#documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html
And also, if you receive your web-service response in JSON format, you can use SBJSON to parse the JSON files. You can get the json framework form this link,
https://github.com/stig/json-framework/
Thanks.
If you would like to know about different XML Parsers available and comparison between them, you can visit this tutorial which shows different xml parsers available and comparison between them.

what's faster on iPhone? XML pList or JSON?

Assuming both XML plist and JSON are delivered over http, gzipped, which one will be processed faster on an iPhone?
A co-worker and I did some rudimentary benchmarks recently to test which was faster for an application we were writing. We tested this JSON framework, and the NSXML parser as well as a TreeNode parser we found in an Objective-C book. Here is the note I sent to the other developers on our team:
The benchmark tested how each library handled getting the filename and path
of 100 assets, 100 times each (for a total count of 10,000 runs per library).
The results are below:
Method Average(s) Total(s)
TreeNode 0.307475 30.747493
NSXML 0.483778 48.377843
JSON 0.233179 23.317870
JSON beats plists according to this:
http://samsoff.es/posts/web-services-with-cocoa-surprise
It depends on the data that is delivered and the way it is parsed, but they should both be similar in speed. You should just choose the one that is easier for you to develop a parser and then fine tune the parser.
In the "Building a Server-Driven User Experience" session of WwDC, an Apple developer stated that PLIST was preferred for being faster and easier to use.

Using core data with web services

I am a newbie in Xcode. I am developing an iPhone app where I need to send and receive data from a web service. And I need to store them temporarily in my app. I don't want to use SQLite. So I wondering if I should use core data for this purpose. I read some articles but I still don't have a clear picture of How to do it, because I have used core data only with SQLite. I want to do the following things :
How to receive table data from a web service?
Have to perform certain calculations on those fields.
How to send the data back in xml format to the server?
How do I convert the xml data into int, date or any other data type? And How do I store it in managed data objects?
You want to use an XML parser to turn the XML into other objects; I tend to recommend TouchXML for that.
You can use Core Data and an in memory store if you are not going to save the data as it will then create and manage all of the data objects for you and generally give you less code to write. However that depends on your app if it is worth it or not. Personally i use Core Data in every app that works with data.
As for sending data, you can use the same library that you used to consume the XML to produce XML. Most of them now days are bi-directional.
For a specific example of fetching XML from server and then storing on the device using core data take a look at Björn Sållarp's blog post on Core Data and UITableView. A drill-down application. Note this example makes use of NSXMLParser and not TouchXML.
I have also found [coredatalibrary xcode template][2] to be quite useful in getting started with a new Core Data project.
Also if you are adding custom logic to your managed objects take a look at rentzch's [mogenerator][3] which generates 2 classes _MyEntity and its subclass MyEntity.

Saving and Editing JSON on iPhone/iPod

What's the best method for editing and saving a JSON file on the iPhone/iPod? I know there are libraries that allow you to easily read JSON data, but are there any that allow you to generate it?
TouchJSON reads and generates JSON, is quite fast, and uses very little memory.
JSON Framework is supposedly faster, but uses much more memory.
The iPhone also includes a built-in JSON parser/generator, but it's only available through private APIs. You probably shouldn't use this one.
TouchJSON allows conversion both to and from JSON with a single call like:
[[CJSONSerializer serializer] serializeObject:someDictionaryofYours];

Is there an easy way to work with web services for iPhone dev?

We want to take XML data and convert it to an NSDictionary object, but we don't want to manually iterate over the XML. Is there an easy way to do this? How are you doing web services for your iPhone app?
If you have control over the XML output you could try creating a property list which you can then read into a dictionary using -dictionaryWithContentsOfURL: (though the better asynchronous way would be to get the data using an NSURLConnection and then converting the data using the -propertyList method on NSString). You can find more about property lists here: http://developer.apple.com/documentation/Cocoa/Conceptual/PropertyLists/Introduction/chapter_1_section_1.html
Of course the best solution is to use a RESTful client and use a combination of NSURLConnection to get/send the data and the TouchXML classes (http://code.google.com/p/touchcode/wiki/TouchXML) to parse the data, though this would require more work to put the data into a dictionary. Of course if these are going to be the main data objects in your system you really want to be using either a custom class or SQLite to store the data as it provides you much more reliability in testing your app than a dictionary.
If you can control the server output, try using plists. Otherwise you're stuck with parsing XML (or JSON if the server can do that), but there are frameworks you can use. See the answer to this question.
Also, here is a good overview of how to do RESTful clients on the iphone:
https://developer.apple.com/webapps/articles/creatingrestfulclients.html
You can return the data in JSON format. There are many open-source JSON parsers available for the iPhone (TouchJSON being one).
There's another class available called NSPropertyListSerialization which gets you a dictionary from data.
You can do something like this with the data you receive
NSDictionary* propertyList;
NSPropertyListFormat format;
NSString *errorStr;
propertyList = [NSPropertyListSerialization
propertyListFromData:receivedData
mutabilityOption: NSPropertyListImmutable
format: &format
errorDescription: &errorStr];
Sorry, don't know what tags are used here for formatting code!