如何在iOS App中解析JSON

时间:2011-09-23 14:00:19

标签: ios arrays string json parsing

我以字符串的形式从twitter获得回复

我需要的是将注释的部分发送到数组,

这里是一个字符串

的例子
[{"geo":null,"coordinates":null,"retweeted":false,... 
"text":"@KristinaKlp saluditos y besos d colores!"},{"geo":null,"coordinates...

所以我真正需要的是“文字”之后的帖子:“=

  

@KristinaKlp saluditos y besos d colores!

那么,我怎样才能获取字符串并解析它,以便有希望得到数组中的所有消息?

非常感谢!

6 个答案:

答案 0 :(得分:10)

我没有在iOS应用程序中自己进行JSON解析,但您应该能够使用像json-framework这样的库。这个库将允许您轻松地解析JSON并从字典/数组生成json(这实际上是所有JSON的组成)。

SBJson docs:

  

JSON以下列方式映射到Objective-C类型:

     
      
  • null - > NSNull
  •   
  • string - >的NSString
  •   
  • 数组 - >的NSMutableArray
  •   
  • 对象 - >的NSMutableDictionary
  •   
  • true - > NSNumber的-numberWithBool:是
  •   
  • false - > NSNumber的-numberWithBool:否
  •   
  • 最多19位数的整数 - > NSNumber的-numberWithLongLong:
  •   
  • 所有其他数字 - > NSDecimalNumber
  •   
     

由于Objective-C没有布尔值的专用类,   这些转变为NSNumber实例。但是,因为这些   使用-initWithBool:方法初始化它们往返于JSON   正常。换句话说,他们不会默默地突然变成0或1;   他们将再次表现为“真实”和“虚假”。

     

作为优化整数,长度最多为19位(最大长度   对于有符号的长整数)转换为NSNumber实例,而   复杂的转变为NSDecimalNumber实例。因此,我们可以避免任何   由于JSON允许可笑的大数字而失去精确度。

     

@page objc2json Objective-C to JSON

     

Objective-C类型以下列方式映射到JSON类型:

     
      
  • NSNull - >空
  •   
  • NSString - >串
  •   
  • NSArray - >阵列
  •   
  • NSDictionary - >对象
  •   
  • NSNumber的-initWithBool:是 - >真
  •   
  • NSNumber的-initWithBool:否 - >假
  •   
  • NSNumber - >编号
  •   
     

@note在JSON中,对象的键必须是字符串。的NSDictionary   键不一定是,但试图转换NSDictionary   进入JSON的非字符串键会引发异常。

     

使用-numberWithBool:方法创建的NSNumber实例是   转换为JSON布尔“true”和“false”值,副   反之亦然。任何其他NSNumber实例都将转换为JSON编号   你会期待的方式。

<强>教程

  

有没有教程?是!这些都是由教程提供的   第三方人:

     

JSON Framework for iPhone - 约翰三部分的Flickr教程   Muchow。 JSON Over HTTP On The iPhone - Dan Grigsby。 AS3 to Cocoa touch:安迪雅各布斯的JSON。

您还可以查看其他图书馆,如TouchJSON,JSONKit,还有另一个JSON图书馆

答案 1 :(得分:4)

NSJSONSerialization可以很好地将您的JSON数据转换为可用的数据结构,如NSDictionary或NSArray。我推荐它,甚至更多,因为它是Cocoa公共接口的一部分,它由Apple维护。

但是,如果要将JSON的内容映射到Objective-C对象,则必须将NSDictionary / NSArray中的每个属性映射到对象属性。如果你的对象有很多属性,这可能会有点痛苦。

为了自动化该过程,我建议您使用NSObject上的Motis类别(个人项目)来完成它,因此它非常轻巧和灵活。您可以在this post中了解如何使用它。但只是为了向您展示,您只需要定义一个字典,其中包含您的JSON对象属性到NSObject子类中的Objective-C对象属性名称的映射:

- (NSDictionary*)mjz_motisMapping
{
    return @{@"json_attribute_key_1" : @"class_property_name_1",
             @"json_attribute_key_2" : @"class_property_name_2",
              ...
             @"json_attribute_key_N" : @"class_property_name_N",
            };
}

然后执行解析:

- (void)parseTest
{
    NSData *data = jsonData; // <-- YOUR JSON data 

    // Converting JSON data into NSArray (your data sample is an array)
    NSError *error = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];

    if (error)
        return; // <--- If error abort.

    // Iterating over raw objects and creating model instances
    NSMutableArray *parsedObjects = [NSMutableArray array];

    for (NSDictionary *rawObject in jsonArray)
    {
        // Creating an instance of your class
        MyClass instance = [[MyClass alloc] init];

        // Parsing and setting the values of the JSON object
        [instance mjz_setValuesForKeysWithDictionary:rawObject];

        [parsedObjects addObject:instance];
    }

    // "parseObjects" is an array with your parsed JSON.
    // Do whatever you want with it here.
}

通过KeyValueCoding(KVC)设置字典中的属性,您可以在通过KVC验证设置之前验证每个属性。

答案 2 :(得分:1)

为了更好地比较iOS上JSON解析的不同库的速度,请查看The Ultimate Showdown

答案 3 :(得分:1)

我最近不得不这样做。在查看了各种选项之后,我将JSONKit扔进了我的应用程序(我在StackOverflow上的JSON讨论中找到了它)。为什么? A)非常简单。我的意思是,它只有基本的解析/发射功能,你还需要什么? B)非常非常快。没有开销 - 只需完成工作。

我应该注意,我之前从未做过JSON - 只听说过这个词,甚至不知道如何拼写它。我在大约1小时内从零开始,到一个正在运行的应用程序。您只需向应用程序添加一个类(.h,.m),实例化它,并将解析器调用到字典对象。瞧。如果它包含一个数组,你只需获取objectForKey,将其转换为NSArray。很难比这更简单,而且速度非常快。

答案 4 :(得分:1)

-(IBAction)btn_parse_webserivce_click:(id)sender
{
// Take Webservice URL in string.
NSString *Webservice_url = self.txt_webservice_url.text;
NSLog(@"URL %@",Webservice_url);
// Create NSURL from string.
NSURL *Final_Url = [NSURL URLWithString:Webservice_url];
// Get NSData from Final_Url
NSData* data = [NSData dataWithContentsOfURL:
Final_Url];
//parse out the json data
NSError* error;
// Use NSJSONSerialization class method. which converts NSData to Foundation object.

NSDictionary* json = [NSJSONSerialization
JSONObjectWithData:data
options:kNilOptions
error:&error];
// Create Array
NSArray* Response_array = [json objectForKey:@"loans"];
NSLog(@"Array: %@", Response_array);
// Set Response_array  to textview.
self.txt_webservice_response.text = [NSString stringWithFormat:@"%@"
,Response_array];
}

答案 5 :(得分:0)