Json 动态列写入数据库
【问题】
最近做一个网站需要从另外一个网站的 api 获取 json 数据然后存放到自己的数据库。可是本人对于 json 操作一窍不通,所以请教各位大神。废话不多说了代码如下
json 文件内容我已经清理一大部分相同结构的数据:
(里面主要就是 imei 的 Service 列表我把它放到数据库 2 张表里面 groups 跟 Services )
{
“SUCCESS”: [
{
“MESSAGE”: “IMEI Service List”,
“LIST”: {
“MOVISTAR SPAIN”: {
“GROUPNAME”: “MOVISTAR SPAIN”,
“SERVICES”: {
“3”: {
“SERVICEID”: 32,
“SERVICENAME”: “MOVISTAR NOKIA INSTANTE”,
“CREDIT”: 4,
“TIME”: “1-30 Minutes”,
“INFO”: “<p style=\“text-align: center;\”><span style=\“color: #ff0000;\” data-mce-mark=\“1\”>SERVICIO INSTANTE DE 0-10 MINS PARA NOKIAS MOVISTAR(Nodct3/4)
\r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;\” data-mce-mark=\“1\”>CON GUIDADO SERIA C ,mayoriason20digitos \r\n<pstyle=\“text-align:center;\”>å�心部分机型是20ä½�:å<spanstyle=\“font-size:medium;\”> C系列(c2c5),Nokia7230 \r\n<p style=\“text-align: center;\”><span style=\“color: #ff0000;\” data-mce-mark=\“1\”> SERIA ASHA 100, 101, 311, 500 y todos los de estas series \r\n<p style=\“text-align: center;\”><span style=\“color: #ff0000;\” data-mce-mark=\“1\”> Y WINDOWS PHONE Lumia ”,“Requires.Network”: “None”,
“Requires.Mobile”: “None”,
“Requires.Provider”: “None”,
“Requires.PIN”: “None”,
“Requires.KBH”: “None”,
“Requires.MEP”: “None”,
“Requires.PRD”: “None”,
“Requires.Type”: “None”,
“Requires.Locks”: “None”,
“Requires.Reference”: “None”
},
“8”: {
“SERVICEID”: 77,
“SERVICENAME”: “MOVISTAR NOKIA 20 NCK”,
“CREDIT”: 12,
“TIME”: “1-30 Minutes”,
“INFO”: “<p style=\“text-align: center;\”><span style=\“font-size: small; color: #ff0000;\”>ALL NOKIA MOVISTAR SPAIN 20 DIGITS ,<strong style=\“color: #ff0000; font-size: small;\”>NOT SUPPORTED LUMIA 820
\r\n<p style=\“text-align: center;\”><strong style=\“color: #ff0000; font-size: small;\”>Para Confirma si es 20 nck o no ,check info de movil con programa infinity ,descarga desde pagina aportado \r\n<p style=\“text-align: center;\”> ”,“Requires.Network”: “None”,
“Requires.Mobile”: “None”,
“Requires.Provider”: “None”,
“Requires.PIN”: “None”,
“Requires.KBH”: “None”,
“Requires.MEP”: “None”,
“Requires.PRD”: “None”,
“Requires.Type”: “None”,
“Requires.Locks”: “None”,
“Requires.Reference”: “None”
}
}
},
“VODAFONE SPAIN”: {
“GROUPNAME”: “VODAFONE SPAIN”,
“SERVICES”: {
“5”: {
“SERVICEID”: 50,
“SERVICENAME”: “VODAFONE NOKIA BB5 SL3”,
“CREDIT”: 5,
“TIME”: “1-60 Minutes”,
“INFO”: “<p style=\“text-align: center;\”><span style=\“font-size: medium; color: #ff0000;\”>Nokia lumia, nokia 100, 610 y nokias 20 digitos no soportados!
\r\n<p style=\“text-align: center;\”><span style=\“color: #ff0000; font-size: small;\”> Nokia vodafone instante en horario de la tienda \r\n<p style=\“text-align: center;\”><span style=\“color: #ff0000; font-size: small;\”> 20ä½�ç �的手机和LUMIAä¸�支æŒ� \r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;font-size: small;\”> ”,“Requires.Network”: “None”,
“Requires.Mobile”: “None”,
“Requires.Provider”: “None”,
“Requires.PIN”: “None”,
“Requires.KBH”: “None”,
“Requires.MEP”: “None”,
“Requires.PRD”: “None”,
“Requires.Type”: “None”,
“Requires.Locks”: “None”,
“Requires.Reference”: “None”
},
“10”: {
“SERVICEID”: 95,
“SERVICENAME”: “VODAFONE SONY&SONY ERIC(RAPIDO)”,
“CREDIT”: 16,
“TIME”: “1-24 Hours”,
“INFO”: “<p style=\“text-align: center;\”><span style=\“color: #ff0000; font-size: medium;\”>VODAFONE PHONE ,NO NOKIA Y WINDOWN PHONE,NO IPHONEÂ
\r\n<p style=\“text-align: center;\”><span style=\“color: #ff0000; font-size: medium;\”>SAMSUNG CODIGO NO LLEVA DEFREEZE ”,“Requires.Network”: “None”,
“Requires.Mobile”: “None”,
“Requires.Provider”: “None”,
“Requires.PIN”: “None”,
“Requires.KBH”: “None”,
“Requires.MEP”: “None”,
“Requires.PRD”: “None”,
“Requires.Type”: “None”,
“Requires.Locks”: “None”,
“Requires.Reference”: “None”
}
}
}
}
}
],
“apiversion”: “2.0.0”
}
下面是 sql 数据库的的 2 张表的结构:
这里就把需要的字段全部列出来: group 的名称是唯一的。然后 2 张表根据 groupid 关联
Createtable[dbo].[Groups]
(
[ID] [int] IDENTITY(1,1) NOTNULL, –id
[Groupname] [nvarchar] (50) notnulldefault(''), –名称
CONSTRAINT[PK_Groups_id] PRIMARYKEYCLUSTERED
(
[id] ASC
)WITH(IGNORE_DUP_KEY = OFF) ON[PRIMARY]
) ON[PRIMARY]
CREATETABLE[dbo].[Services](
[id] [int] IDENTITY(1,1) NOTNULL, –id
[Serviceid] [int] notnulldefault(0), –服务 id
[Servicename] [nvarchar] (50) notnulldefault(''), –服务名称
[groupid] [int] notnulldefault(0), –组 id
[Credit] [decimal] notnulldefault(0.00), –所需点数
[Time] [nvarchar] (50) notnulldefault(''), –需要的时间
[INFO] [nvarchar] (3000) notnulldefault(''), –信息说明
[Network] [nvarchar] (100) notnulldefault(‘none’), –网络需求
[Mobile] [nvarchar] (100) notnulldefault(‘none’), –移动需求
[Provider] [nvarchar] (100) notnulldefault(‘none’), –供应商需求
[PIN] [nvarchar] (100) notnulldefault(‘none’), –手机 PIN 码需求
[KBH] [nvarchar] (100) notnulldefault(‘none’), –KBH 需求
[MEP] [nvarchar] (100) notnulldefault(‘none’), –MEP 需求
[PRD] [nvarchar] (100) notnulldefault(‘none’), –PRD 需求
[Type] [nvarchar] (100) notnulldefault(‘none’), –类型需求
[Locks] [nvarchar] (100) notnulldefault(‘none’), –是否锁定
[Reference] [nvarchar] (100) notnulldefault(‘none’), –参考需求
[isstatus] [nvarchar] (1) notnulldefault(‘0’), –状态 0 可用 1 不可用
[remark] [nvarchar] (255) notnulldefault(''), –备注
[Pricingid] [int] notnulldefault(0), –价格策略
CONSTRAINT[PK_Services_id] PRIMARYKEYCLUSTERED
(
[id] ASC
)WITH(IGNORE_DUP_KEY = OFF) ON[PRIMARY]
) ON[PRIMARY]
因为还有其他这样的 json 文件,我只需要有个这个方式的转化实例,最最好是能将我上面的成功转化存放到数据库的代码,我参照下操作其他 json 就方便了,之前也百度很多,不过还是有些不明白。而且上面的 json 跟别人百度上的格式有不一样。
【回答】
这里的 JSON 串由于包含多层且很多层都是动态的(如 LIST 和 SERVICES 下的节点数量和名称都不固定),这为解析带来了很大难度;而且其中属性名部分还包含空格(如 MOVISTAR SPAIN)和点号(如 Requires.Network)这也大大增加了解析难度,使用 JAVA 或 C# 太难写了。。。
SPL 提供了 JSON 解析功能,还可以将解析结果写入数据库,完成题目中的要求,脚本可以这样写:
A | B | C | D | E | |
---|---|---|---|---|---|
1 | =file(“d:\\s.json”).read() | ||||
2 | =json(A1) | ||||
3 | =create(Groupname,groupid) | ||||
4 | =create(Serviceid,Servicename,groupid,Credit,Time,INFO,Network,Mobile,Provider,PIN,KBH,MEP,PRD,Type,Locks,Reference) | ||||
5 | for A2.SUCCESS | =A5.LIST.fno() | |||
6 | for B5 | =A5.LIST.field(B6) | |||
7 | =C6.SERVICES.fno() | ||||
8 | for C7 | =C6.SERVICES.fname(C8) | |||
9 | =C6.SERVICES.field(C8) | ||||
10 | =A3.record([C6.GROUPNAME,D8]) | ||||
11 | =A4.record([D9.#1,D9.#2,D8,D9.#3,D9.#4,D9.#5,D9.#6,D9.#7,D9.#8,D9.#9,D9.#10,D9.#11,D9.#12,D9.#13,D9.#14,D9.#15]) | ||||
12 | =connect(“demo”) | ||||
13 | =A12.update(A3,groups,Groupname,groupid;groupid) | ||||
14 | =A12.update(A4,services,Serviceid,Servicename,groupid,Credit,Time,INFO,Network,Mobile,Provider,PIN,KBH,MEP,PRD,Type,Locks,Reference;Serviceid) |
A3 运行结果:
A4 运行结果:
A1: 读取 json 串
A2: 生成序表
A3:创建含有列名的序表
A4:创建含有列名的序表
A5~A11:循环读取 json 数据,填入 A3 和 A4 序表中
A12:连接数据库
A13:更新数据到 groups 表;
A14:更新数据到 services 表