你好,游客 登录 注册 搜索
背景:
阅读新闻

iOS_JSON数据处理,一条龙服务

[日期:2016-08-04] 来源:简书  作者:丶纳凉 [字体: ]

一丶简介

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。_摘抄自百度;

iOS对JSON数据的处理,我把它分为以下几个步骤

1.获取json数据;
2.建立模型;
3.连接数据;
4.生成description

二丶开始上干货

1.获取JSON数据:

1.1为了方便查看JSON数据可以使用以下网址:

可以格式化JSON代码

JSON在线解析及格式http://json.cn/

JSON在线编辑器http://www.qqe2.com/
示例数据
{
  "array": [
    1,
    2,
    3
  ],
  "sex": true,
  "age": 12,
  "id":95757,
  "other": {
    "a": "b",
    "c": "d",
    "e": "f"
  },
  "speak": "Hello World"
}

2.建立模型

这里介绍2种自动生成属性方式:

2.1 插件

ESJsonFormat :https://github.com/EnjoySR/ESJsonFormat-Xcode

Paste_Image.png

效果图展示:

Paste_Image.png

2.2Json-Property-Creat-Code

Json-Property-Creat-Code

这个功能比较强大

json数据生成model 支持KVC,JSModel, model会自动归档 例如输入一个json数据网址,或者将返回的json数据放入展开的输入框中,再输入要生成的model名字,点击生成就可以在桌面上看到你所要的model 可以无限嵌套哦,总而言之,不需要你写一句代码,这个model可以直接使用

效果图展示:

Paste_Image.png

Paste_Image.png

好用,谁用谁知道;

3.连接数据;

3.1

MJExtension(https://github.com/CoderMJLee/MJExtension)
**1> 字典 -> 模型
**2> 模型 -> 字典
**3> 字典数组 -> 模型数组
**4> 模型数组 -> 字典数组

这个不多介绍了,里面介绍很详细,都是中文;

提下,用到系统关键字处理方法:

+ (NSDictionary*)mj_replacedKeyFromPropertyName
{   
return@{@"theID":@"id"};
}

3.2

还有一个YYKit

这个也不错,但是解析速度没有MJExtension快;

4.生成description

思路:利用Runtime获取类的所有属性,然后遍历拼接成一个字符串;

代码已封装如下,继承使用

#import <Foundation/Foundation.h>
@interface BaseObject : NSObject
@end
#import "BaseObject.h"
static NSMutableDictionary *modelsDescription = nil;
@implementation BaseObject
+ (void)load
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        modelsDescription = [NSMutableDictionary dictionary];
    });
}
- (NSDictionary *)mapPropertiesToDictionary
{
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    Class cls = [self class];
    uint ivarsCount = 0;
    Ivar *ivars = class_copyIvarList(cls, &ivarsCount);
    const Ivar *ivarsEnd = ivars + ivarsCount;
    for (const Ivar *ivarsBegin = ivars; ivarsBegin < ivarsEnd; ivarsBegin++)
    {
        Ivar const ivar = *ivarsBegin;
        NSString *key = [NSString stringWithUTF8String:ivar_getName(ivar)];
        if ([key hasPrefix:@"_"]) key = [key substringFromIndex:1];
        id value = [self valueForKey:key];
        [dictionary setObject:value ? value : [NSNull null]
                       forKey:key];
    }
    if (ivars)
    {
        free(ivars);
    }
    return dictionary;
}

- (NSString *)description
{
    NSMutableString *str = [NSMutableString stringWithFormat:@"------<%@>------\n", NSStringFromClass([self class])];
    NSDictionary *dic = [self mapPropertiesToDictionary];
    [dic enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
        [str appendFormat:@"< %@ = %@ >\n", key, obj];
    }];
    [str appendString:@"------<End>------"];
    return str;
}

@end

三丶扩展:

1.有时候服务器返回的JSON中,某个字典是以字符串形式展示,以下扩展,直接使用,不用谢;

@implementation NSString (Extension)
- (NSDictionary *)dictionaryWithJsonString
{
    if (self == nil)
    {
        return nil;
    }
    NSData *jsonData = [self dataUsingEncoding:NSUTF8StringEncoding];
    NSError *err;
    NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];

    if (err)
    {
        Log(@"json解析失败:%@", err);
        return nil;
    }
    return dic;
}

@end




收藏 推荐 打印 | 录入:elainebo | 阅读:
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款