软编码存储字典数据

采用非固定的字段来存储结构化的json数据。

问题

树形非固定字段的结构化数据是无法直接存储在MySQL中的,需要把数据序列化,然后以字符串的方式存储,但是,如果把字段名称硬编码在字段内,对后期字段修改后的兼容性造成影响。

可参考:SAAS插件式配置

方法

把字段名称映射为字段,按照0_1_2的方式来存储,代表第三层的第二个数据(它的根节点为第二层的第一个数据),
字段名称这样就完全映射为了数字,所以还需要一个字段映射表来存储所有的字段与层级的映射关系。

此时,可以通过修改字段名称来实现字段名称的变化。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python
# encoding: utf-8

field_dict = dict()

def f(d, layer):
if not isinstance(d, dict):
return d
r = dict()
i = 0
for k, v in d.items():
layer_key = '%s_%d' % (layer, i)
r[layer_key] = f(v, layer_key)
i += 1
if layer_key not in field_dict:
field_dict[layer_key] = k
return r


d = {
"id": 1,
"name": 'y',
'contact': {
'tel': '13499991111',
'email': 'y@y.com',
},
}

import json

dd = f(d, '0')
print dd
print json.dumps(d)
print json.dumps(dd)

print field_dict