2018-07-26 16:12:46 Luzaofa 阅读数 529

1、json

import json

# 原始数据 list
load_name = ['luzaofa1', 'luzaofa2', 'luzaofa3', 'luzaofa4', 'luzaofa5']
load_age = [12, 13, 14, 15, 16]
load_mail = ['@126', '@163', '@gmail', '@qq', '@sbs']

# json样式定义
Jtype = {"Name":load_name, "Age":load_age, "Mail":load_mail}
Dtype = {'Pmass':[Jtype]}

# 序列化数据
data_old = json.dumps(Dtype)

# 数据加载
data_new = json.loads(data_old)
get_name = data_new['Pmass'][0]['Name']
get_age = data_new['Pmass'][0]['Age']
get_mail = data_new['Pmass'][0]['Mail']

# 输出自定义样式数据
num = 0
for name in get_name:
    print('Name: %s, Age:%s, Mail: %s' % (name, get_age[num], get_mail[num]))
    num += 1

2、dic

REPLACE_STR_DICT = {
    'A00月份': 'F2',
    'B01日期': 'F1',
}

dic = {}

for key, value in REPLACE_STR_DICT.items():
    dic[key] = [value, value, value]

print(dic)
2018-10-31 21:08:06 u010953692 阅读数 478

1,python数据转换为json数据

#!/usr/local/bin/python3
# coding:utf-8
import json
data = '{"name": "ni", "city": "tt", "id" : 2256}'
print (data)
print (type(data))
#print (data['name'])
json_str = json.loads(data)
print (type(json_str))
print (json_str['name'])
print ("测试") 
{"name": "ni", "city": "tt", "id" : 2256}
<class 'str'>
<class 'dict'>
ni
测试

  • 报错,data里面字符串必须使用双引号

Expecting property name enclosed in double quotes

2,json.dumps() 和 json.loads() 编码和解码JSON数据

json.dumps():将python中的字典转换为字符串
json.loads(): 将字符串转换为字典

#!/usr/local/bin/python3
# coding:utf-8
import json
data = {
    'name' : 'ni', 
    'city' : 'tt', 
    'id' : 2256
}
print ("data : " , data)
print ("type data : " , type(data))
print ("data['name']: " , data['name'])
data_str = json.dumps(data)
print ("data_str type : " , type(data_str))
print ("data_str : " , data_str)
data_json = json.loads(data_str)
print ("type data_json : " , type(data_json))
print ("data_json['name'] : ", data_json['name'])
print ("测试") 
data :  {'name': 'ni', 'city': 'tt', 'id': 2256}
type data :  <class 'dict'>
data['name']:  ni
data_str type :  <class 'str'>
data_str :  {"name": "ni", "city": "tt", "id": 2256}
type data_json :  <class 'dict'>
data_json['name'] :  ni
测试

3,文件转换为字典

$ cat data
{
    "name" : "ni", 
    "city" : "tt", 
    "id" : 2256
}
$ 

#!/usr/local/bin/python3
# coding:utf-8
import json
file = "/root/data"
print ("file type : " , type(file))

file_open = open(file , 'r')
print ("file_open type : " , type(file_open))

file_read = file_open.read()
print ("file_read type : " , type(file_read))

data = json.loads(file_read)
print ("data type : " , type(data))
print ("data['name'] : " , data['name'])

print ("测试")
file type :  <class 'str'>
file_open type :  <class '_io.TextIOWrapper'>
file_read type :  <class 'str'>
data type :  <class 'dict'>
data['name'] :  ni
测试
#!/usr/local/bin/python3
# coding:utf-8
import json
file = "/Users/y50/data"
with open (file , 'r') as f:
    file_read = f.read()
    data = json.loads(file_read)
    print (data['name'])
print ("测试")
ni
测试

参考:

  1. Docs » 第六章:数据编码和处理 » 6.2 读写JSON数据
  2. Python 中将字符串转换为字典的方法
  3. Python3 JSON 数据解析
  4. python读写json文件
  5. Python txt文件读取写入字典的方法(json、eval)
2019-06-25 20:30:25 r77683962 阅读数 320
def json_txt(self, dic_json):
    #self.debug_print("json_txt")
    if isinstance(dic_json, dict):  # 判断是否是字典类型isinstance 返回True false
        for key in dic_json:
            #dic_json = json.loads(s)
            s = dic_json[key]
            #self.debug_print(str(len(s)) + " type:" + str(type(s)))
            t=str(type(s))
            if t.startswith("<class 'list'>"):
                for i in range(0, len(s)):
                    self.debug_print("%s %d:" % (key, i))
                    self.json_txt(s[i])
            else:
                self.debug_print("%s: %s" % (key, s))
    else:
        self.debug_print("else")
2017-01-22 18:39:35 weixin_37141881 阅读数 521

三篇参考文章:http://stackoverflow.com/questions/24310324/deserialize-json-nsdictionary-to-swift-objects,

                        http://swift.oz-apps.com/2015/04/creating-a-class-from-a-string-in-swift/

                        https://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/

swift不支持动态类初始化,这样就不能将获取到的JSON或字典转为对象。没有了对象,我们队数据的操作就只能通过valueForKey,no,这是绝对不行的。

要想对类进行动态初始化,

最简单的方式,在类中加入关键字:@(类名)

@objc(Level)
class Level: NSObject {
    var backGroundMusic:String?
    var backGroundImageUrl:String?
    var level:NSNumber?
    var numberOfBalls:NSNumber?
    var numberOfDrops:NSNumber?
    var fallingSpeed:NSNumber?
    var scoreGoal:NSNumber?
}
//
//  LevelResponse.swift
//  DropProjectsGame
//
//  Created by lin kang on 17/1/23.
//  Copyright © 2017年 lin kang. All rights reserved.
//

import UIKit

@objc(LevelResponse)
class LevelResponse: NSObject {
    var results:[Level]?
}


这样就可以使用 NSClassFromString(),方法获得类,并初始化。不然其值为空。

这是我的读取字典,并转换为对象的方法:

这里上一次我忽略了类中包含类属性,类中包含数组等可能性,这个需要用递归的方法将其全部迭代找完。

今天重新修改了一下

//
//  Dictionary Extention.swift
//  DropProjectsGame
//
//  Created by lin kang on 17/1/22.
//  Copyright © 2017年 lin kang. All rights reserved.
//

import UIKit

let classNameKey = "className"

extension NSDictionary{

    static func decodeDic(dicOrigin:[String:AnyObject])->AnyObject?{
        
        if let className:String = (dicOrigin[classNameKey] as? String){
//            print("xx:\(NSClassFromString(className) as? NSObject.Type)")
            if let classType = (NSClassFromString(className) as? NSObject.Type){
                //获取类实例
                let instance = classType.init()

                let keys = dicOrigin.keys;
                
                for var key in keys
                {
                    if key != classNameKey {
                        var value = dicOrigin[key];
                        //是数组,那么进行数组处理
                        if (value is NSArray) {
                            value = handleArray(originArray: value as! NSArray)
                        //是字典,那么是类,进行类处理
                        }else if (value is NSDictionary ){
                            value = decodeDic(dicOrigin: value as! [String : AnyObject]) as AnyObject?
                        }
                        //类属性赋值
                        if instance.responds(to: NSSelectorFromString(key)) {
                            instance.setValue(value, forKey: key )
                        }
                    }
                    
                }
                return instance ;
            }else{
                print("\(className)没有此类型")
            }
        }
        return nil
    }
    
    static func handleArray(originArray:NSArray)->NSArray{
        var arrayResult =  [AnyObject]()
        for item in originArray{
            var value = item
            //是数组继续迭代
            if item is NSArray {
               value = handleArray(originArray: item as! NSArray)
            }else if item is [String:AnyObject] {
                //是字典转为类的处理
                value =  NSDictionary.decodeDic(dicOrigin: item as! [String:AnyObject]) as AnyObject!
            }
            //其他类型则加入数组
            arrayResult.append(value as AnyObject)
        }
        return arrayResult as NSArray
    }
}


规则前提,字典代表类,必须传入className字符串,缺点是每个字典都要传入类名。

只需调用方法decodeDic()即可转为className中的类实例,以后有更好的转换方法,我将继续优化。


这是我本地Plist种的数据:




在写这个代码时,真是被?optional 和 !给整烦了,

一点点经验:如果报错:unwrap optional,那说明你在使用一个optional的值,要将它加上!不能为空。

2017-01-04 15:01:45 walkerwqp 阅读数 8399

swift3.0发布有一段时间了,发现很多朋友在swift3.0json解析上上遇到很多问题,我这边为大家提三种常见的json方案。

1.第一种是自带的字典转模型,自带的需要实现系统的setValue方法,然后自己还要实现dictToModel方法即可解析,这里我已经实现好了


2.第二种是采用swiftyJson,当然swiftyJson也可以直接解析, 结合 MJextension组合解析,具体的文件和代码,在最下面的demo里面,先用swiftyJson解析出数据,swiftyJson的好用之处就是在于它可以直接解析到你想要的数据层,比如:




然后再用MJExtension配合转模型,下面就能成功解析了


3、第三种就是直接用MJExtension解析,如果你还对oc的MJExtension念念不让,在swift 3.0中只需要桥接就可以使用了,具体桥接方法只需直接将MJExtesnsion文件拖入swift工程中,系统会自动帮你生成一个桥接文件





字典json的读取

阅读数 8

从json到抽取关键词

阅读数 1458

没有更多推荐了,返回首页