文章目录
JSON
JSON 是一种数据存储的规范,存储在硬盘上的多是 .json
文件;而在程序的处理中,经常是某个 字符串 符合 JSON 规范,这个字符串可以被相关的各种函数进行各种类型的处理。(PS:可以百度到各种检查一个文本是否符合 JSON 规范的网页)
常用于不同工程之间数据的中转(特别是这些工程都适用不同的语言的时候),许多语言对于 JSON 都有良好的支持;同时,JSON文件本身也具有一定的可阅读性。
JSON 文件组织
JSON 文件由一个 Dictionary 或者一个 Dictionary 数组(List, vector之类)组成,其文件组织如下(注意,不论是 dict 还是 list ,其最后一个元素后面都是没有 ,
的:
- 一个 Dictionary
{
"eax": 0,
"ecx": 0,
"edx": 0,
"ebx": 0
}
- Dictionary 数组
[
{
"eax": 0,
"ecx": 0,
"edx": 0,
"ebx": 0
},
{
"eax": 0,
"ecx": 0,
"edx": 0,
"ebx": 0
}
]
Python JSON
python 自带 JSON 的处理包
import json
导入 JSON (serialize)
dump(obj, fp)
可以将一个对象直接 dump 到本地文件,例如:
with open("output.json", "w") as f:
json.dump(obj, f)
dumps(obj)
函数可以将一个组织好的dict
或者list
直接 dump 成一个 JSON 格式的 string
stra = json.dumps(dicta)
dumps
函数有很多可选参数,例如:indent
可以指定每个单元之间换行并缩进相应长度,不同层次结构之间的缩进是累加的,缩进的效果如我前面的那两个 JSON 展示所示。(python.org 上的 json ,这里还有输出的转换表)
需要注意的是,json.dumps()
返回一个符合 JSON 规范的 string, 当时,如果只是简单地将几个这样的 string 拼接在一起,得到的结果并不是正确的 JSON 字符串,因此,如果需要导出多个这样的 dict
,请将它们组织在同一个 list
中。
jsonStr = json.dumps([dicta, dictb, dictc])
得到的 string 就可以通过 python 的 文件读写 或 命令行里的输出重定向 等方式输出到文件
导入 JSON (Deserialize)
与输出的方式相似,json.load()
和 json.loads()
提供了从文件和字符串读入(Deserialize)的方式。
python tricks
对于 python 的内置数据类型,如 list
, dict
可以直接使用 son.dumps()
去做。但是如何简单快速地导出我们自己写的类呢?如果我们的类定义如下:
class register:
def __init__(self):
self.eax = 0;
self.ecx = 0;
self.edx = 0;
self.ebx = 0;
怎样才能快速地把这个类转换成一个如下的 dict 呢?
{'eax':0, 'ecx':0, 'edx':0, 'ebx':0}
对于 python 的每一个类,都有一些名字是 __xxx__
的 method,即便对于我们自己写的类,尽管我们没有去重写这些 method ,python 也会自动帮我们生成一个默认的 method 。这里我们用到的就是 __dict__
>>> reg = register()
>>> print(reg.__dict__)
{'eax': 0, 'ecx': 0, 'edx': 0, 'ebx': 0}
>>> json.dumps(reg.__dict__)
'{"eax": 0, "ecx": 0, "edx": 0, "ebx": 0}'
C sharp
(废话:由于我需要提供从 python 到 Unity 的数据交流,因此这里直接跳到了 C#)
C sharp 文件读写
参考 MS 给出的一个范例:link “读取和回显文件”
Deseralize JSON
推荐使用 Newtonsoft 包,这个可以在 VS 或 Rider 里下载。
using Newtonsoft.Json;
// in a certain function:
// one dict
var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(file);
// one list
var list = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(file);