labbyfrost
labbyfrost

Reputation: 39

Parsing list of json

I need to parse list of json stored in a single file !

What I have done so far is, test.json file contains:

{"location":"lille","lat":28.4,"long":51.7,"country":"FR"}

with this file I have the code below

    public class JsonReader {
        public static void main(String[] args) throws ParseException {
            JSONParser parser = new JSONParser();
    try {
    Object obj = parser.parse(new FileReader("c:\\test.json"));
    JSONObject locationjson= (JSONObject) obj;
        String location= (String) locationjson.get("location");
        System.out.printf("%s",location);
    long lat = (Long) locationjson.get("lat");
    System.out.printf("\t%d",lat);
//similarly for other objects           

This is a working code and I am able to print only one json in the file test.json

Now if I have to print a list of json in file: test1.json as shown below: each line is a single valid json and there are list of json in a single file. What I need is to parse each json and print it in each line. Will using a bean class work?

{"Atlas":{"location":"lille","lat":28.4,"long":51.7,"country":"FR"}}
{"Atlas":{"location":"luxum","lat":24.1,"long":54.7,"country":"LU"}}
{"Atlas":{"location":"ghent","lat":28.1,"long":50.1,"country":"BE"}}
{"Atlas":{"location":"alborg","lat":23.4,"long":53.7,"country":"DN"}}

Your help is appreciated !

Upvotes: 0

Views: 1141

Answers (3)

BrainyMonkey
BrainyMonkey

Reputation: 31

First of all:make sure you have created a class just for the son item for each row that has the string properties in the header file and synthesized in the implementation file.Then create a property array in the implementation file that will be doing the parsing.In the parse file..use NSJSONSerialization in your retrieve data method:

-(void)retrieveData{

    NSURL * url =[NSURL URLWithString:getDataURL];
    NSData *data =[NSData dataWithContentsOfURL:url];

    json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
    newsArray = [[NSMutableArray alloc]init];

    for (int i = 0; i < json.count; i++){
        {
            NSString * cID =[[json objectAtIndex:i]objectForKey:@"Name1"];
            NSString * cName = [[json objectAtIndex:i]objectForKey:@"name2"];
            NSString * cState =[[json objectAtIndex:i]objectForKey:@"name3"];
            NSString * cPopulation =[[json objectAtIndex:i]objectForKey:@"Edition"];
            NSString * cCountry =[[json objectAtIndex:i]objectForKey:@"name4"];
City *myCity = [[City alloc]initWithCityID:cID andCityName:cName andCityState:cState andCityPopulation:cPopulation andCityCountry:cCountry];
            [newsArray addObject:myCity];
        }
        [self.myTableView reloadData];
    }    
}

Then retrieve the son objects or arrays and enter them in the name 1 name 2 section to parse them to your table.Also make sure you have already setup your Table and assigned it a cell identifier and indexed to row.

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
     //static NSString *strIdentifier=@"identity";
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if(cell == nil){
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }
   // cell.textLabel.text = [NSString stringWithFormat:@"Cell %d",indexPath.row];

    City *currentCity =[newsArray objectAtIndex:indexPath.row];
    cell.textLabel.text = currentCity.Name1;
    cell.detailTextLabel.text = currentCity.Name2;

    return cell;

}

Upvotes: 0

Brian Agnew
Brian Agnew

Reputation: 272217

The JSON should have a root node.

If you don't have that, you can read from the file line-by-line, and pass each line into the JSONParser wrapped in a StringReader (since the JSONParser.parse() method takes a Reader).

e.g.

   BufferedReader in
      = new BufferedReader(new FileReader("test.json"));
   while(!done) {
      String s = in.readLine();
      if (s == null) {
         done = true;
      }
      else {
         StringReader sr = new StringReader(s);
         // etc...
      }
   }

Edit: I've assumed you're using JSONParser. If you're using a different parser (which one?) then it may take a String argument.

Upvotes: 1

Talha Ahmed Khan
Talha Ahmed Khan

Reputation: 15433

JSONParser.parse() also takes the String as an aurgument.

Read the file with FileReader and for each line that you read use JSONParser.parse(String) method.

Upvotes: 0

Related Questions