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 表