解析json获得的值不是有序的

时间:2016-03-24 11:37:11

标签: ios core-data nsdictionary

我有以下json

{
  "status": 1,
  "value": {
    "shipment_master": {
      "1": "Order Placed",
      "2": "In Production",
      "3": "Quality Check In progress",
      "4": "Goods received for shipment",
      "5": "Stuffing in progress",
      "6": "Cargo Shipped"
    }
  }
}

我解析上面的json并将其添加到db,如下所示,

  NSDictionary *valueDict = [jsonDic objectForKey:@"value"];
         NSArray *details = [valueDict objectForKey:@"shipment_master"];

         for (NSDictionary *response in details) {
             NSManagedObjectContext *context = [self managedObjectContext];

             // remove all rows

             [context performBlockAndWait:^{
                 // add new row(s)
                 NSManagedObject *master = [NSEntityDescription insertNewObjectForEntityForName:@"ShipmentMaster" inManagedObjectContext:context];
                 NSError *error;

                 // TODO: set values here (e.g. [pendingShipment setValue:...)
                 [master setValue:[details valueForKey:response] forKey:@"values"];

                 // save MOC
                 if ([context hasChanges]) {
                     (void)[context save:&error];
                 }
             }];
         }

问题在于,当我再次获取数据时,这些值与从服务器接收的值不同。我的意思是orderplaced来自in productionquality check in prorgress来自inproduction之后等等......但是当我获取数据时,数据是无序的。是因为NSDictionary在解析json时以无序方式获取值吗?还是有其他原因吗?

我尝试将NSArray更改为NSDictionary,将valueForKey更改为objectForKey,但问题仍然存在。

以下是我更新的代码,

NSString* pendingResponse = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
             NSData *jsonData = [pendingResponse dataUsingEncoding:NSUTF8StringEncoding];
             NSDictionary *jsonDic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingAllowFragments error:nil];
             NSDictionary *valueDict = [jsonDic objectForKey:@"value"];
             NSDictionary *details = [valueDict objectForKey:@"shipment_master"];

             for (NSDictionary *response in details) {
                 NSManagedObjectContext *context = [self managedObjectContext];

                 // remove all rows

                 [context performBlockAndWait:^{
                     // add new row(s)
                     NSManagedObject *master = [NSEntityDescription insertNewObjectForEntityForName:@"ShipmentMaster" inManagedObjectContext:context];
                     NSError *error;

                     // TODO: set values here (e.g. [pendingShipment setValue:...)
                     [master setValue:[details objectForKey:response] forKey:@"values"];

                     // save MOC
                     if ([context hasChanges]) {
                         (void)[context save:&error];
                     }
                 }];
             }

1 个答案:

答案 0 :(得分:1)

如果您希望以特定顺序返回数据,则需要在搜索谓词中指定该数据。看起来你没有存储id,但如果订单很重要,你需要存储某种形式的索引。

let sortDescriptor = NSSortDescriptor(key: "id", ascending: true)
let sortDescriptors = [sortDescriptor]
request.sortDescriptors = sortDescriptors