IOS----Objective-C中JSON解析与XML解析

来源:互联网 发布:java入门经典电子书 编辑:程序博客网 时间:2024/05/16 10:44

JSON解析

1.实质

将返回的数据放入模型(model)中 json(相对于xml的数据,轻巧,传输速率高,冗余的数据少。缺点:可读性差些)

xml(冗余的数据多,优点:可读性强,扩展性强)

2.解析步骤

(1)查看解析文档,建立模型类

如解析文档为:

  1. {
  2. "name" : “三年一班”,
  3. "number" : 14,
  4. "students" : [
  5. {
  6. "age" : 20,
  7. "mark" : 90,
  8. "name" : "张亮"
  9. },
  10. {
  11. "age" : 21,
  12. "mark" : 89,
  13. "name" : "王凯"
  14. },
  15. ],
  16. "teacher" : {
  17. "age" : 18,
  18. "lesson" : "OC",
  19. "name" : "Lucy"
  20. }
  21. }

建立模型对象为:

学生(Student类),含有age(NSInteger),mark(NSInteger),name(NSString)三个属性

  1. @interface Student : NSObject
  2. @property(nonatomic,assign)NSInteger age;
  3. @property(nonatomic,assign)NSInteger mark;
  4. @property(nonatomic,copy)NSString *name;
  5. @end

讲师(Teacher类),含有age(NSInteger),lesson(NSString),name(NSString)三个属性

  1. @interface Teacher : NSObject
  2. @property(nonatomic,assign)NSInteger age;
  3. @property(nonatomic,copy)NSString *lesson;
  4. @property(nonatomic,copy)NSString *name;
  5. @end

班级(Classes类),含有name(NSInteger),number(NSInteger),students(NSArray),teacher(Teacher)四个属性

  1. @interface Classes : NSObject
  2. @property(nonatomic,copy)NSString *name;
  3. @property(nonatomic,assign)NSInteger number;
  4. @property(nonatomic,strong)NSMutableArray *students;
  5. @property(nonatomic,strong)Teacher *teacher;
  6. @end

注:
1.解析数据中{}为字典,[]或()为数组
2.无特殊情况,属性名与解析数据名称相同,遇到关键字除外
3.存在数组,对象等属性时,在init方法中初始化

(2)获取数据

1. 与服务器交互,把下载路径写下来

  1. NSURL *url = [NSURL URLWithString:@"http://192.168.158.32/apple/JSONFile.json”];

若为本地路径

  1. NSURL *url = [[NSURL allocinitFileURLWithPath:@“/Users/apple/Desktop/test.txt”];

2. 获取数据,用二进制获取数据NSData

  1. NSData *data = [NSData dataWithContentsOfURL:url];

3. 序列化,将JSON最外层转化为字典

  1. NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

options是NSJSONReadingOptions枚举值,可能的值有:

NSJSONReadingAllowFragments 生成字典和数组可变

NSJSONReadingMutableLeaves 生成的字符串可修改

NSJSONReadingAllowFragment 允许生成顶层对象非字典或数组

3.解析数据

(1)解析外层数据

  1. #define NFC(I) [NSString stringWithFormat:@"%@",I]
  2. NSString *classname = NFC([dic objectForKey:@"name"]);
  3. NSInteger classnumber = [[dic objectForKey:@"number"] integerValue];

(2)将解析后的数据传给模型

  1. Classes *classes = [[Classes alloc]init];
  2. classes.name = classname;
  3. classes.number = classnumber;

(3)解析学生,其对象为数组。使用循环逐层解析

  1. NSArray *stuarr = [dic objectForKey:@"students"];
  2. for (NSDictionary *studic in stuarr) {
  3. NSInteger stuage = [[studic objectForKey:@"age"] integerValue];
  4. NSInteger mark = [[studic objectForKey:@"mark"] integerValue];
  5. NSString *stuname = NFC([studic objectForKey:@"name"]);

将数据传给模型

  1. Student *student = [[Student alloc]init];
  2. student.age = stuage;
  3. student.mark = mark;
  4. student.name = stuname;
  5.  
  6. [classes.students addObject:student];
  7. }

(4)解析讲师,其对象为Teacher对象,将其转换为字典继续解析

  1. NSDictionary *teacherdic = [dic objectForKey:@"teacher"];
  2. NSString *teachername = NFC([teacherdic objectForKey:@"name"]);
  3. NSString *lesson = NFC([teacherdic objectForKey:@"lesson"]);
  4. NSInteger teaage = [[teacherdic objectForKey:@"age"] integerValue];

将数据传给模型

  1. Teacher *teacher = [[Teacher alloc]init];
  2. teacher.age = teaage;
  3. teacher.lesson = lesson;
  4. teacher.name = teachername;
  5.  
  6. classes.teacher = teacher;

注:
1)建立模型对象时,随着解析而建,即需要建立到时候建立
2)解析顺序,由上到下,由内到外

XML解析

两种方法,一种是第三方库,GData,用于XML格式的解析,第二种方法,是官方提供的一个方法。本文档使用第三方库操作。

1.XML文档:

  1. 标签/节点 <root></root>
  2. 标签名 root

【注】最上一级节点称为根节点

<CityName>北京</CityName>标签值 北京

<Item key="1" value="报纸"> </Item>
属性: key="1"
属性名: key
属性值: "1"


xml数据(文档)自上而下的树形结构

<root>.....</root>(一个完整的节点),root节点的名称(标题) 中间的(....)为节点的内容
每个xml文档只有一个根节点(树形结构中最外层的节点)
xml文档(数据)由多个节点组成(根节点->子节点->子节点....)

2.使用第三方库操作

解析xml经常使用库: GData
底层使用系统的libxml2库, 使用的时候添加libxml2

  • (1)导入GData库
  • (2)添加libxml二进制库
    Build Phases ---> Link Binary 添加 libxml2.dylib
  • (3)设置头文件搜索路径
    Build Setting--->header search Paths
    双击后,点加号
    添加 /usr/include/libxml2
    //libxml2是系统库,需要到系统的目录下找到。
  • (4)如果是arc的工程
    Build Phases ---> Compile Source File
    GDataXmlNode.m --禁止-- ARC: -fno-objc-arc
  • (5)添加“GDataXMLNode.h”文件到头文件中,如工程能编译通过,则说明 GDataXMLNode 添加成功

3.解析xml

(1)解析内容为

  1. <root>
  2. <name value="lucy">
  3. <age>26</age>
  4. <id>0001</id>
  5. </name>
  6. </root>

(2)解析数据
与服务器交互,建立模型,转换成二进制NSData与JSON解析相同。

1)根据xml文档建立模型

  1. @interface Person : NSObject
  2. @property(nonatomic,copy)NSString *name;
  3. @property(nonatomic,copy)NSString *age;
  4. @property(nonatomic,copy)NSString *pID;
  5. @end

2)与服务器交互

  1. NSURL *url = [NSURL URLWithString:@"http://192.168.158.32/apple/excise.xml"];
  2. NSData *data = [NSData dataWithContentsOfURL:url];

3)把数据装换成xml

  1. GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:data options:GDataXMLInvalidKind error:&error];

4)取根结点

  1. GDataXMLElement *arr = [doc rootElement];

5)取出跟下面的所有子节点 第二层

  1. NSArray *names = [arr children];

6)取出唯一的一个第二层的字节点 name结点

  1. GDataXMLElement *name = [names objectAtIndex:0];

7)取出对应的属性

  1. NSString *nameValue = [[name attributeForName:@"value"] stringValue];

8)取出name的字节点

  1. NSArray *ages = [name children];
  2. NSString *age = [[ages objectAtIndex:0] stringValue];
  3. NSArray *IDs = [name children];
  4. NSString *ID = [[IDs objectAtIndex:1] stringValue];

9)把数据放到模型中

  1. Person *person = [[Person alloc]init];
  2. person.age = age;
  3. person.ID = ID;
  4. person.name = nameValue;

:GDataXMLNode也能用于解析

0 0
原创粉丝点击