NSMutableArray 到 JSON 对象

Posted

技术标签:

【中文标题】NSMutableArray 到 JSON 对象【英文标题】:NSMutableArray to JSON object 【发布时间】:2014-07-08 11:22:20 【问题描述】:

我有一个方法,我想返回 NSData 对象或格式必须是 JSON 对象的“NSString”。

目前这就是我所拥有的;

-(NSData *)JSONData

     NSMutableArray* arr = [NSMutableArray array];
     for (int j = 0; j < self.sales.subArray.count; j++)
     
        SalesObject* subCategory = [self.sales.subArray objectAtIndex:j];


        NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys:
                                 @"category_id",subCategory.category_id,
                                 @"discounted",@"0",
                                 @"price",subCategory.price,
                                 @"active",subCategory.isActive, nil];
        NSLog(@"Dict %@",dict);

       [arr addObject:dict];

    

    NSLog(@"Arr %@",arr);

   NSLog(@"Arr %@",arr);

   NSString *string = [arr description];
   NSData * jsonData = [NSJSONSerialization dataWithJSONObject:string options:kNilOptions error:nil];
   NSLog(@"JSON Data %@",jsonData);

   return jsonData;

如您所见,我尝试将 NSMutableArray 转换为 NSData 对象,但没有成功。我明白了;

 Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid (non-string) key in JSON dictionary'

我现在收到以下错误;

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSJSONSerialization dataWithJSONObject:options:error:]: Invalid top-level type in JSON write'

【问题讨论】:

Objective-C / ios: Converting an array of objects to JSON string的可能重复 你是什么意思,但它不起作用。?那应该是正确的 @KumarKL 我得到`由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'JSON字典中的无效(非字符串)键'` 使用 NSMutableArray* 创建数组对象 arr = [[NSMutableArray alloc] init]; NSLog(@"Arr %@",arr);的日志是什么? 【参考方案1】:

您在正确的轨道上,但您的键/值对颠倒了。而是使用新的 Objective-C 字典文字语法,它更短更容易阅读,因此更容易发现错误:

NSDictionary *dict = @
    @"category_id" : subCategory.category_id,
    @"discounted"  : @"0",       // Should that be @(0) ???
    @"price"       : subCategory.price,
    @"active"      : subCategory.isActive
;

EDIT 额外的问题与使用数组描述(即字符串)有关,而不是数组本身用于创建 JSON 数据。应该是:

NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arr
                                                   options:kNilOptions
                                                     error:&error];
if (!jsonData) 
    NSLog(@"Achtung!  Failed to create JSON data: %@", [error localizedDescription]);

【讨论】:

好抓住了错误。 谢谢!但是知道我得到另一个错误。我相信我也在正确的轨道上。请看上面【参考方案2】:

更改字典定义
 NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys:
                             @"category_id",subCategory.category_id,
                             @"discounted",@"0",
                             @"price",subCategory.price,
                             @"active",subCategory.isActive, nil];

NSDictionary * dict =[NSDictionary dictionaryWithObjectsAndKeys:
                             subCategory.category_id,@"category_id",
                             @"0", @"discounted",
                             subCategory.price,@"price",
                             subCategory.isActive, @"active", nil];

【讨论】:

以上是关于NSMutableArray 到 JSON 对象的主要内容,如果未能解决你的问题,请参考以下文章

在iOS中使用NSString参数迭代NSMutableArray对象后,需要生成一个JSON文档上传到服务器[关闭]

NSMutableArray 中的对象

如何将特定 NSMutableArray 中的数据重新加载到 UITableView

在 PHP 中将 NSMutableArray 发送到 Json 服务器

访问 NSMutableArray 对象以在 TableView 上使用

JSON 到 NSMutableArray iOS