# json  转义 dump    反转义 load
# json 模块的限制
# 1.json格式的key必须是字符串数据类型
# 2.json格式中的字符串只能是""

#---------------------------------------------字典------------------------------------------------------

#-----字典中的 k 值-------------如果是数字为key,那么dump之后回强转成字符串数据类型

# import json
# dic = {1:2,3:4}
# str_dic = json.dumps(dic)      # 使用dumps对定义好的字典进行转义
# print(str_dic)                # 结果为 {"1": 2, "3": 4}
#
# new_dic = json.loads(str_dic)  # 使用loads 对之前转义过的字符串反转义成为之前的数据类型--字典
# print(new_dic)                 #{'1': 2,'3': 4}

#--- dic = {k1:(元组)} 元组会被强制转换为列表

# import json
# dic ={"k1":"v1","k2":(1,2,3)}
# str_dic = json.dumps(dic)        # 将字典转义成为一个字符串,其中value 如果是元组的话,回别强制转化成为列表
# print(str_dic,type(str_dic))        # 结果是{"k1": "v1", "k2": [1, 2, 3]}  <class 'str'>
# new_dic = json.loads(str_dic)    #将之前转化成字符串的字典反转义成为原来的字典,里面的元组还是回保留成为列表数据类型.
# print(new_dic,type(new_dic))        # 结果是{'k1': 'v1', 'k2': [1, 2, 3]}   <class 'dict'>


# ----字典( k 不可以使用元组)

# import json
# dic = {(1,2,3):"v1"}     # 字典可以被定义
# str_dic = json.dumps(dic)  # 因为字典中的 k 值是一个元组,不支持,所以程序会报错.
# print(str_dic)


#-----------------------------------------列表-------------------------------------------------

# ---------将列表转义成字符串写入文件,再读取文件中的字符串,反转义成为列表打印

# import json
# lst = ["aaa",123,"bbb",12.345]
# with open("lst.txt","w") as f:   # 打开一个文件
#     json.dump(lst,f)               # 将列表lst 转义成为一个字符串,并且将此字符串写入文件中.
# with open("lst.txt") as f:      #打开刚刚那个文件.
#     ret = json.load(f)            # 将文件中的保存的字符串类型的文件反转义成为之前的列表
#     print(ret,type(ret))          # 结果是 ['aaa', 123, 'bbb', 12.345]  <class 'list'>


#------可以多次将列表,字典,dump转义放入到文件,但是不能从文件一次性load 将文件取出来反转义

# import json
# dic = {"abc":(1,2,3)}                  # 定义一个字典
# lst = ["aaa","123","bbb","456"]      #定义一个列表
# with open("json_demo","w") as f:    #打开文件
#     json.dump(lst,f)                   #将转义后的列表写入到文件中
#     json.dump(dic,f)                   #将转义后的字典写入到文件中
# with open("json_demo") as f:         #打开文件
#     ret = json.loads(f)                 #将文件中的内容进行反转义读出来 ------(不允许将多次写入的内容一次性读出来,程序会报错)
#     print(ret)

# -------------想将多个类型的数据dumps写入文件中,并且loads取出来(将文件单独转义,每一个文件写一行,取出来的时候也是按一行取出来)

# import json
# dic = {"k1":"v1","k2":"v2"}           #定义一个字典
# lst = [1,2,3,4]                         #定义一个列表
# with open("json_dome","w") as f:     #打开文件
#     str_dic = json.dumps(dic)           #将字典进行转义
#     str_lst = json.dumps(lst)           #将列表进行转义
#     f.write(str_dic+"\n")              #将转义后的字典(字符串类型)写入文件中,光标跳到下一行开头
#     f.write(str_lst+"\n")              #将转义后的列表(列表类型) 写入文件中 ,重新起一行开始写入
# with open("json_dome") as f:         #打开文件获取到文件句柄
#     for i in f:                        #分别取出文件中每一行
#         ret = json.loads(i)            #将每一行进行反转义(每一行就是之前的一个文件)
#         print(ret)

#------------ 转义过程中有中文 ensure_ascii = False

# import json
# dic = {"a":"b","country":"中国"}
# # ret = json.dumps(dic,ensure_ascii=True)    # {"a": "b", "country": "\u4e2d\u56fd"}
# ret = json.dumps(dic,ensure_ascii=False)    #  {'a': 'b','country': '中国'}
# print(ret)
# dic_new = json.loads(ret)
# print(dic_new)

#----------写入文件过程中有中文

# 中文格式的 ensure_ascii = False
# import json
# dic = {'abc':(1,2,3),'country':'中国'}
# ret = json.dumps(dic,ensure_ascii = False)
# print(ret)
# dic_new = json.loads(ret)
# print(dic_new)
# 
# with open('json_demo','w',encoding='utf-8') as f:
#     json.dump(dic,f,ensure_ascii=False)


# json的其他参数,是为了用户看的更方便,但是会相对浪费存储空间
# import json
# data = {'username':['李华','二愣子'],'sex':'male','age':16}
# json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False)
# print(json_dic2)

# set不能被dump/dumps