-3

我有以下 JSON 数据:

(
    3,
        {
        body = "123";
        date = 1333023644;
        mid = 12;
        "read_state" = 0;
    },
        {
        body = ":)";
        date = 1332968570;
        mid = 4;
        "read_state" = 1;
    },
        {
        body = "1234";
        date = 1331844024;
        mid = 1;
        "read_state" = 1;
    }
)

我想用这段代码得到一个body值数组:

NSArray *array = [dialogsDictionary objectForKey:@"body"];

但我总是得到这个错误:

*由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[__NSArrayM objectForKey:]: unrecognized selector sent to instance 0x6b65a60'

4

3 回答 3

1

考虑这个 JSON 字符串。

  {
   "arrayOfData": [
    {
        "body": "123",
        "date": 1333023644,
        "mid": 12,
        "read_state": 0
    },
    {
        "body": ": )",
        "date": 1332968570,
        "mid": 4,
        "read_state": 1
    },
    {
        "body": "1234",
        "date": 1331844024,
        "mid": 1,
        "read_state": 1
    }
    ]
  }

这是一个有效的 JSON 字符串。您可以使用http://jsonlint.com/检查有效性

假设您的 JSON 数据位于jsonDataNSData 类型的变量中。使用SBJSON,您可以像解析 JSON

  NSDictionary *jsonDictionary = [jsonData JSONValue];

  NSArray *array = [jsonDictionary objectForKey:@"arrayOfData"];

  NSMutableArray *result = [[NSMutableArray alloc]init];
  for(NSDictionary *dict in array){
      [result addObject:[dict objectForKey:@"body"]];
  }

在此操作之后,键的所有值body都将在结果数组中。

如果“3”是数组计数,则您可能已将该值包含在 JSON 中,如下所示:

{
"numberOfElementsInArray": 3,
"arrayOfData": [
    {
        "body": "123",
        "date": 1333023644,
        "mid": 12,
        "read_state": 0
    },
    {
        "body": ": )",
        "date": 1332968570,
        "mid": 4,
        "read_state": 1
    },
    {
        "body": "1234",
        "date": 1331844024,
        "mid": 1,
        "read_state": 1
    }
]
}

请参阅有关 JSON 的教程。你必须读过这个网站才能理解 JSON

由 Hot Licks 添加

你不明白的是,原来的 JSON 本质上是这样的:

[
    3,
    {
        "body": "123",
        "date": 1333023644,
        "mid": 12,
        "read_state": 0
    },
    {
        "body": ": )",
        "date": 1332968570,
        "mid": 4,
        "read_state": 1
    },
    {
        "body": "1234",
        "date": 1331844024,
        "mid": 1,
        "read_state": 1
    }
]

它的格式不同,因为它是一个 NSLog 对象转储,而不是原始 JSON 源。完全合法的 JSON。

于 2012-03-30T16:29:52.583 回答
0

看起来你正在使用 sudzc

尝试:

if( [value isKindOfClass:[NSError class]] || [value isKindOfClass:[SoapFault class]] ) {

    NSLog(@"%@", [value description]);
    return;
}

// Verify we're a dictionary
if( ![value isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: Response not a dictionary");
    return;
}

NSDictionary* dict = (NSDictionary*)value;
NSDictionary* resp = [dict objectForKey:@"3"];
if( ( resp == nil ) || ![resp isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: 3 not a dictionary");
    return;
}
dict = [resp objectForKey:@"body"];
if( ( dict == nil ) || ![dict isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: body not a dictionary");
    return;
}
resp = [dict objectForKey:@"date"];
if( ( resp == nil ) || ![resp isKindOfClass:[NSDictionary class]] ) {

    NSLog(@"ERROR: date not a dictionary");
    return;
}
于 2012-03-29T19:09:20.923 回答
-1

您提供的 JSON 无效。

   (

    {
    body = "123";
    date = 1333023644;
    mid = 12;
    "read_state" = 0;
},
    {
    body = ":)";
    date = 1332968570;
    mid = 4;
    "read_state" = 1;
},
    {
    body = "1234";
    date = 1331844024;
    mid = 1;
    "read_state" = 1;
}
)

如果您的 JSON 数据与上面给出的一样,则需要编写

 for(NSDictionary *dict in Array){
  [result addObject:[dict objectForKey:@"body"]];
 }

'array' result将包含对应于 'body' 对象的字典对象

于 2012-03-29T17:00:50.280 回答