【问题】
最近需要从另一个网站做一个网站。 api 获取 json 然后将数据存储到自己的数据库中。但是我是为了 json 操作一无所知,请问大神。废话不多说,代码如下 json 我已经清理了大部分结构相同的数据: (里面主要是 imei 的 Service我把它放在数据库列表中 2 张表里面 groups 跟 Services)
{ “SUCCESS”:[ { “MESSAGE”:“IMEIServiceList”, “LIST”:{ “MOVISTARSPAIN”:{ “GROUPNAME”:“MOVISTARSPAIN”, “SERVICES”:{ “3”:{ “SERVICEID”:32, “SERVICENAME”:“MOVISTARNOKIAINSTANTE”, “CREDIT”:4, “TIME”:“1-30Minutes”, “INFO”:“<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;\”data-mce-mark=\“1\”>SERVICIOINSTANTEDE0-10MINSPARANOKIASMOVISTAR????Nodct3/4??‰ \r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;\”data-mce-mark=\“1\”>CONGUIDADOSERIAC???mayoriason20digitos \r\n<pstyle=\“text-align:center;\”>?????é?¨?????o?????ˉ20???:?<spanstyle=\“font-size:medium;\”> C?3???—(c2c5)???Nokia7230 \r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;\”data-mce-mark=\“1\”> SERIAASHA100,101,311,500ytodoslosdeestasseries \r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;\”data-mce-mark=\“1\”> YWINDOWSPHONELumia ”, “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”:“MOVISTARNOKIA20NCK”, “CREDIT”:12, “TIME”:“1-30Minutes”, “INFO”:“<pstyle=\“text-align:center;\”><spanstyle=\“font-size:small;color:#ff0000;\”>ALLNOKIAMOVISTARSPAIN20DIGITS,<labelstyle=\“color:#ff0000;font-size:small;\”>NOTSUPPORTEDLUMIA820 \r\n<pstyle=\“text-align:center;\”><labelstyle=\“color:#ff0000;font-size:small;\”>ParaConfirmasies20nckono,checkinfodemovilconprogramainfinity,descargadesdepaginaaportado \r\n<pstyle=\“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” } } }, “VODAFONESPAIN”:{ “GROUPNAME”:“VODAFONESPAIN”, “SERVICES”:{ “5”:{ “SERVICEID”:50, “SERVICENAME”:“VODAFONENOKIABB5SL3”, “CREDIT”:5, “TIME”:“1-60Minutes”, “INFO”:“<pstyle=\“text-align:center;\”><spanstyle=\“font-size:medium;color:#ff0000;\”>Nokialumia,nokia100,610ynokias20digitosnosoportados! \r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;font-size:small;\”> Nokiavodafoneinstanteenhorariodelatienda \r\n<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;font-size:small;\”> 20??????????‰???o?’?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”:“VODAFONESONY&SONYERIC(RAPIDO)”, “CREDIT”:16, “TIME”:“1-24Hours”, “INFO”:“<pstyle=\“text-align:center;\”><spanstyle=\“color:#ff0000;font-size:medium;\”>VODAFONEPHONE,NONOKIAYWINDOWNPHONE,NOIPHONE? \r\n<pstyle=\“text-align:center;\”><spanstyle=\“colo: #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 表