json解析
1. json 模块提供了一种很简单的方式来编码和解码 JSON 字符串。其中两个主要有下面 4 个函数:
1)pythonObj= json.loads(jsonStr): 已编码的 JSON 字符串解码为 Python 对象
2)pythonObj = json.load(file): 用于从 json 文件中读取数据。
3)jsonStr = json.dumps(pythonObj): 将 Python 对象编码成 JSON 字符串
4)json.dump(pythonObj, file):将 Python 对象 写成 json 文件。
python 原始类型向 json 类型的转化对照表:
Python JSON dict -> object list, tuple -> array str, unicode -> string int, long, float -> number True -> true False -> false None -> null
JSON 编码支持的基本数据类型为 None ,bool ,int ,float 和 str ,以及包含这些类型数据的 lists,tuples 和 dictionaries。
下面来看一些例子:
json_str = json.dumps(data) data = json.loads(json_str) """ 一般来讲,JSON 解码会根据提供的数据创建 dicts 或 lists。如果你想要创建其他 类型的对象,可以给 json.loads() 传递 object_pairs_hook 或 object_hook 参数。例 如,下面是演示如何解码 JSON 数据并在一个 OrderedDict 中保留其顺序的例子: """ data = json.loads(s, object_pairs_hook=OrderedDict) # Writing JSON data with open('data.json', 'w') as f: json.dump(data, f) # Reading data back with open('data.json', 'r') as f: data = json.load(f)
2. 下面是如何将一个 JSON 字符串转换为一个 Python 对象例子:
import json s = '{"name": "ACME", "shares": 50, "price": 490.1}' class JSONObject: def __init__(self, d): self.__dict__ = d data = json.loads(s, object_hook=JSONObject) # key 变成属性 print(data.name) print(data.shares) print(data.price)
json 字符串可以反序列化为 Python 对象,但通常 Python 对象实例并不是 JSON 可序列化的。例如:
import json class Point: def __init__(self, x, y): self.x = x self.y = y p = Point(2, 3) # json.dumps(p) # 出错:Object of type Point is not JSON serializable """ 如果你想序列化对象实例,你可以提供一个函数,它的输入是一个实例,返回一个 可序列化的字典。 """ def serialize_instance(obj): d = { '__classname__' : type(obj).__name__ } d.update(vars(obj)) return d p = Point(2,3) s = json.dumps(p, default=serialize_instance) print(s) # {"__classname__": "Point", "x": 2, "y": 3}
3. 一个查找 json 值的递归程序
key_list = ['key1', 'key2', 'key3', 'key4'] def is_key_match(key, suffix): if len(key) < len(suffix): return False length = len(suffix) if str(key[-length:]).lower() == str(suffix).lower(): return True return False def get_json_value(json_obj, key_lst, is_value_only): if isinstance(json_obj, dict): for key in json_obj.keys(): if is_key_match(key, key_lst[0]): if len(key_lst) == 1: if is_value_only: return json_obj[key] else: return {key : json_obj[key]} # return a map res = get_json_value(json_obj[key], key_lst[1:], True) if is_value_only: return res else: return {key : res} if is_value_only: return '' else: return {}