繁体   English   中英

如何在iOS App中解析JSON

[英]How to parse JSON in iOS App

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

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

这里是一个字符串的例子

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

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

@KristinaKlp saluditos y besos d colores!

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

非常感谢!

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

SBJson文档:

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

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

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

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

@page objc2json Objective-C到JSON

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

  • NSNull - > null
  • NSString - >字符串
  • NSArray - >数组
  • NSDictionary - >对象
  • NSNumber的-initWithBool:是 - > true
  • NSNumber的-initWithBool:NO - > false
  • NSNumber - >数字

@note在JSON中,对象的键必须是字符串。 NSDictionary键不一定是,但尝试将带有非字符串键的NSDictionary转换为JSON将引发异常。

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

教程

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

适用于iPhone的JSON框架 - 由John Muchow三部分组成的Flickr教程。 iPhone上的JSON Over HTTP - 作者:Dan Grigsby。 AS3到Cocoa touch :Andy Jacobs的JSON。

您还可以查看其他库,如TouchJSON,JSONKit,Yet Another JSON Library

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

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

为了自动化该过程,我建议您使用NSObject上的Motis类别(个人项目)来完成它,因此它非常轻巧和灵活。 您可以在这篇文章中阅读如何使用它。 但只是为了向您展示,您只需要定义一个字典,其中包含您的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验证设置之前验证每个属性。

-(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];
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM