zoukankan      html  css  js  c++  java
  • Json转model对象,model转json,解析json字符串

    GitHub链接:
    https://github.com/mozhenhau/D3Json

    D3Json

    通过swift的反射特性,把json数据转换为model对象,本类最主要是解决了其他一般json转换类不能转换自定义对象的问题
    只有一个文件:D3Json.swfit
    扩展写在addExtension。可以参照扩展

    Usage

    例子在D3Json的Project里面,写了两个测试,一个是json转单model,一个是转model的list
    在playgroud里面也有两个例子,但是playgroud里面,alloc自己定义的model时直接出错,可能是playgroud的bug

    只需要一句代码:
    var user:User = D3Json.jsonToModel(json, objc: User())就可以把json数据转换成User类

    转成list对象:
    var user:Array = D3Json.jsonToModelList(jsons, objc:User())就可以把json数据转换成Array类

    Problem

    1. 不处理optional类型,建议写model类时先初始化
    2. 因为swift的反射reflect的缺陷,父类的属性不能转换

    Requirements

    • iOS 7.0+ / Mac OS X 10.9+
    • Xcode 6.1
    • Integration
    • CocoaPods (iOS 8+, OS X 10.9+)

    2.model对象转回Json

    let data : NSData! = try? NSJSONSerialization.dataWithJSONObject(user, options: [])
    model对象转Json,使用自带的NSJSONSerialization:
    转载地址:http://www.hangge.com/blog/cache/detail_647.html
    
    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let label:UILabel = UILabel(frame:CGRectMake(100, 100,300,100));
            label.text = "输出结果在控制台"
            self.view.addSubview(label)
            //测试结果在output终端输入,也可以建个命令行应用测试就可以了
            testJson()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
        }
    
        //测试json
        func testJson() {
            //Swift对象
            let user = [
                "uname": "张三",
                "tel": ["mobile": "138", "home": "010"]
            ]
            //首先判断能不能转换
            if (!NSJSONSerialization.isValidJSONObject(user)) {
                print("is not a valid json object")
                return
            }
            //利用OC的json库转换成OC的NSData,
            //如果设置options为NSJSONWritingOptions.PrettyPrinted,则打印格式更好阅读
            let data : NSData! = try? NSJSONSerialization.dataWithJSONObject(user, options: [])
            //NSData转换成NSString打印输出
            let str = NSString(data:data, encoding: NSUTF8StringEncoding)
            //输出json字符串
            print("Json Str:"); print(str)
    
            //把NSData对象转换回JSON对象
            let json : AnyObject! = try? NSJSONSerialization
                .JSONObjectWithData(data, options:NSJSONReadingOptions.AllowFragments)
            print("Json Object:"); print(json)
            //验证JSON对象可用性
            let uname : AnyObject = json.objectForKey("uname")!
            let mobile : AnyObject = json.objectForKey("tel")!.objectForKey("mobile")!
            print("get Json Object:"); print("uname: (uname), mobile: (mobile)")
        }
    }

    3.解析json字符串

    (由于是字符串内容是json数组,则转成NSArray。如果字符串是json对象,则转成NSDictionary。)

    let string: NSString = "[{"ID":1,"Name":"元台禅寺","LineID":1},{"ID":2,"Name":"田坞里山塘","LineID":1},{"ID":3,"Name":"滴水石","LineID":1}]"
    let data = string.dataUsingEncoding(NSUTF8StringEncoding)
    
    let jsonArr = try! NSJSONSerialization.JSONObjectWithData(data!,
        options: NSJSONReadingOptions.MutableContainers) as! NSArray
    
    print("记录数:(jsonArr.count)")
    for json in jsonArr {
        print("ID:", json.objectForKey("ID")!, "    Name:", json.objectForKey("Name")!)
    }
  • 相关阅读:
    URL地址中中文乱码详解(javascript中encodeURI和decodeURI方法、java.net.URLDecoder.encode、java.net.URLDecoder.decode)
    Java transient关键字使用小记
    java 序列化Serializable 详解
    JRE和JDK的区别
    JavaEE汇总
    Oracle汇总
    java提高篇(四)-----理解java的三大特性之多态
    SQL根据出生日期精确计算年龄、获取日期中的年份、月份
    PL/SQL学习笔记(四)之——删除重复记录
    PL/SQL学习笔记(二)
  • 原文地址:https://www.cnblogs.com/melons/p/5791904.html
Copyright © 2011-2022 走看看