JsonHelper.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645
  1. /******************************************************************************
  2. * 文件名称: JsonHelper.cs
  3. * 文件说明: Json业务的封装,处理JSON串的封装,解析等
  4. * 当前版本: V1.0
  5. * 创建日期: 2022-04-14
  6. *
  7. * 2020-04-14: 增加 setIrisInpar 方法
  8. * 2020-04-14: 增加 setIrisInpar(重载) 方法
  9. * 2020-04-14: 增加 getIrisExceptionJson 方法
  10. * 2020-04-14: 增加 parseBusinessJson 方法
  11. ******************************************************************************/
  12. using Newtonsoft.Json.Linq;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using PTMedicalInsurance.Common;
  19. using System.IO;
  20. using PTMedicalInsurance.Variables;
  21. using Newtonsoft.Json;
  22. using GMCrypto.Lib;
  23. namespace PTMedicalInsurance.Helper
  24. {
  25. public class JsonHelper
  26. {
  27. //static EncryptHelper encrypt = new EncryptHelper();
  28. private static readonly HashSet<string> ValidInfnoSet = new HashSet<string> { "3501", "3502" };
  29. public static string toJsonString(object obj,bool missingNull)
  30. {
  31. JsonSerializerSettings settings = new JsonSerializerSettings();
  32. if (missingNull)
  33. {
  34. settings.NullValueHandling = NullValueHandling.Ignore;
  35. }
  36. return JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
  37. }
  38. public static string toJsonString(object obj)
  39. {
  40. return toJsonString(obj,true);
  41. }
  42. public static JObject toJObject(object obj)
  43. {
  44. string data = toJsonString(obj, true);
  45. return JObject.Parse(data);
  46. }
  47. public static object toObject(string json)
  48. {
  49. return JsonConvert.DeserializeObject(json);
  50. }
  51. public static T toObject<T>(JObject joObject)
  52. {
  53. return joObject.ToObject<T>();
  54. }
  55. /// <summary>
  56. /// 解析医保平台返回对象
  57. /// </summary>
  58. /// <typeparam name="T"></typeparam>
  59. /// <param name="response"></param>
  60. /// <returns></returns>
  61. public static T getOutput<T>(JObject response)
  62. {
  63. if (response.ContainsKey("output"))
  64. {
  65. return response["output"].ToObject<T>();
  66. }
  67. return response.ToObject<T>();
  68. }
  69. /// <summary>
  70. /// 解析IRIS系统返回对象
  71. /// </summary>
  72. /// <typeparam name="T"></typeparam>
  73. /// <param name="response"></param>
  74. /// <returns></returns>
  75. public static T getResult<T>(JObject response)
  76. {
  77. Response resp = response.ToObject<Response>();
  78. if (resp.errorCode == "0")
  79. {
  80. if (resp.result?.GetType() == typeof(JObject))
  81. {
  82. JObject ret = (JObject)resp.result;
  83. JArray lists = ret.Value<JArray>("rows");
  84. if (lists?.Count > 0)
  85. {
  86. return lists.ToObject<T>();
  87. }
  88. else {
  89. return ret.ToObject<T>();
  90. }
  91. }
  92. if (resp.result?.GetType() == typeof(JArray))
  93. {
  94. JArray lists = (JArray)resp.result;
  95. if (lists?.Count > 0)
  96. {
  97. return lists[0].ToObject<T>();
  98. }
  99. }
  100. }
  101. return default;
  102. }
  103. /// <summary>
  104. /// 根据JSonPath查找节点值,如果节点不存在则返回空值
  105. /// </summary>
  106. /// <param name="jo"></param>
  107. /// <param name="jsonPath"></param>
  108. /// <returns></returns>
  109. public static string getDestValue(JObject jo, string destPath)
  110. {
  111. JToken jt = jo.SelectToken("$." + destPath);
  112. if (jt != null)
  113. {
  114. return jt.ToString();
  115. }
  116. else
  117. {
  118. //Global.writeLog(destPath + "的JToken属性值为空");
  119. return "";
  120. }
  121. }
  122. /// <summary>
  123. /// 将指定的json内容转为对象
  124. /// </summary>
  125. /// <typeparam name="T"></typeparam>
  126. /// <param name="jo"></param>
  127. /// <param name="destPath"></param>
  128. /// <returns></returns>
  129. public static T parseObject<T>(JObject jo, string destPath)
  130. {
  131. JToken jt = jo.SelectToken("$." + destPath);
  132. if (jt != null)
  133. {
  134. return jt.ToObject<T>();
  135. }
  136. else
  137. {
  138. //Global.writeLog(destPath + "的JToken属性值为空");
  139. return default;
  140. }
  141. }
  142. public static string getDestProperty(JObject jo, string propertyName)
  143. {
  144. JProperty jp = jo.Property(propertyName);
  145. if (jp != null)
  146. {
  147. string jpStr = jp.ToString();
  148. string rtnResult = "{ " + jpStr + "}";
  149. return rtnResult;
  150. }
  151. else
  152. {
  153. //Global.writeLog(propertyName + "的JProperty属性值为空");
  154. return "";
  155. }
  156. }
  157. /// <summary>
  158. /// 压缩JSON,占用体积减小(重载)
  159. /// </summary>
  160. /// <param name="json"></param>
  161. /// <returns></returns>
  162. public static string Compress(string json)
  163. {
  164. StringBuilder sb = new StringBuilder();
  165. using (StringReader reader = new StringReader(json))
  166. {
  167. int ch = -1;
  168. int lastch = -1;
  169. bool isQuoteStart = false;
  170. while ((ch = reader.Read()) > -1)
  171. {
  172. if ((char) lastch != '\\' && (char) ch == '\"')
  173. {
  174. if (!isQuoteStart)
  175. {
  176. isQuoteStart = true;
  177. }
  178. else
  179. {
  180. isQuoteStart = false;
  181. }
  182. }
  183. if (!Char.IsWhiteSpace((char) ch) || isQuoteStart)
  184. {
  185. sb.Append((char) ch);
  186. }
  187. lastch = ch;
  188. }
  189. }
  190. return sb.ToString();
  191. }
  192. public static string Compress(JObject jsonObj)
  193. {
  194. //https://blog.csdn.net/yangjiaosun/article/details/103717256
  195. return Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj);
  196. }
  197. /// <summary>
  198. /// 组织异常JSON串
  199. /// </summary>
  200. /// <param name="errorCode"></param>
  201. /// <param name="errorMessage"></param>
  202. /// <returns></returns>
  203. public static JObject setExceptionJson(int errorCode, string eventName, string errorMessage)
  204. {
  205. dynamic joRtn = new JObject();
  206. joRtn.errorCode = errorCode;
  207. joRtn.errorMessage = eventName + "提示:" + errorMessage;
  208. return joRtn;
  209. }
  210. /// <summary>
  211. /// 组织中心入参(明文)。部分代码是需要解析明文入参的,为了方便增加该方法
  212. /// </summary>
  213. /// <param name="infno"></param>
  214. /// <param name="input"></param>
  215. /// <returns></returns>
  216. public static string setCenterInpar_plain(string infno, string input)
  217. {
  218. return setCenterInpar_plain(infno, (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(input));
  219. }
  220. /// <summary>
  221. /// 组织中心入参(明文)。部分代码是需要解析明文入参的,为了方便增加该方法
  222. /// </summary>
  223. /// <param name="infno"></param>
  224. /// <param name="input"></param>
  225. /// <returns></returns>
  226. public static string setCenterInpar_plain(string infno, JObject joInput)
  227. {
  228. return setCenterInpar(infno, joInput);
  229. }
  230. /// <summary>
  231. /// 移动支付组织中心入参
  232. /// </summary>
  233. /// <param name="infno"></param>
  234. /// <param name="input"></param>
  235. /// <returns></returns>
  236. public static string setMPCenterInpar(string infno, JObject joInput)
  237. {
  238. return setMPCenterInpar(infno, joInput.ToString());
  239. }
  240. /// <summary>
  241. /// 移动支付组织中心入参
  242. /// </summary>
  243. /// <param name="infno"></param>
  244. /// <param name="input"></param>
  245. /// <returns></returns>
  246. public static string setMPCenterInpar(string infno, string txtData)
  247. {
  248. EncryptHelper encrypt = new EncryptHelper(Global.inf.MobilePay.appid, Global.inf.MobilePay.secretKey, Global.inf.MobilePay.publicKey, Global.inf.MobilePay.privateKey);
  249. string plainText = SignUtil.SortInput(JObject.Parse(txtData));
  250. string signData = "";
  251. string output = encrypt.encrypt(txtData, ref signData);
  252. return output;
  253. }
  254. public static string setCenterInpar(string infno, JObject joInput)
  255. {
  256. dynamic Jo = new JObject();
  257. Jo.infno = infno;
  258. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  259. Jo.msgid = Global.curEvt.msgid;
  260. Global.pat.mdtrtarea_admvs = Global.inf.areaCode;
  261. // 参保地医保区划
  262. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs??"";
  263. // 就医地
  264. Jo.mdtrtarea_admvs = Global.pat.mdtrtarea_admvs;
  265. //3501和3505 ,就医地必须上传所在区(镇)的区划,其余交易传东莞市的区划
  266. //string[] infnoArray = new string[] { "3501","3502"};
  267. //if (infnoArray.Contains(infno))
  268. //{
  269. // Jo.mdtrtarea_admvs = "";
  270. //}
  271. HashSet<string> ValidInfnoSet = new HashSet<string> { "3501", "3502" };
  272. if (ValidInfnoSet.Contains(infno))
  273. {
  274. if (Global.inf.hospitalName.Contains("光明"))
  275. {
  276. Jo.mdtrtarea_admvs = "441930";
  277. }
  278. else
  279. {
  280. Jo.mdtrtarea_admvs = "441919";
  281. }
  282. }
  283. Jo.recer_sys_code = "SY";
  284. Jo.dev_no = "00FFF254308F";//设备编号
  285. Jo.dev_safe_info = "";
  286. Jo.signtype = "SM3"; ;
  287. Jo.infver = "v1.0";
  288. Jo.opter_type = Global.user.type; ;
  289. Jo.opter = Global.user.ID; ;
  290. Jo.opter_name = Global.user.name; ;
  291. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  292. Jo.fixmedins_code = Global.inf.hospitalNO;
  293. Jo.fixmedins_name = Global.inf.hospitalName;
  294. Jo.sign_no = Global.curEvt.signno;
  295. Jo.cainfo = "";
  296. //Jo.cainfo = "0416509a2c98da94f3840cfb45c6119365a0e166f608d7d1002d70f377ceb46cb0f0f483a20df1eb75e96e8498b9184106d9d8361bf37550ae8d228d6ad3e7127eb0de8868606f18f7a840f238200ab201cd5f10ec4f1490529d9e4c599f2a78dd1917287003ada3699fcc1046e493db974572386f898f3c9c96c5e0ea348e7dc0";
  297. if (joInput != null)
  298. {
  299. Jo.Add("input", joInput);
  300. }
  301. else
  302. {
  303. Jo.Add("input", "");
  304. }
  305. var request = Utils.Wrapper(Jo);
  306. return JsonHelper.toJsonString(request);
  307. }
  308. /// <summary>
  309. /// 组织Iris入参
  310. /// </summary>
  311. /// <param name="code"></param>
  312. /// <param name="joParam"></param>
  313. /// <returns></returns>
  314. public static JObject setIrisInpar(string code, JObject joParam)
  315. {
  316. try
  317. {
  318. dynamic joInparam = new JObject();
  319. joInparam.code = code;
  320. dynamic joTmp = new JObject();
  321. JArray jaParam = new JArray();
  322. // 去掉包装
  323. JObject joInput = Utils.removeWrapper(joParam);
  324. jaParam.Add(joInput);
  325. if (!joInparam.ContainsKey("HospitalDr"))
  326. {
  327. joInparam.Add("HospitalDr", Global.inf.hospitalDr);
  328. }
  329. if (!joInparam.ContainsKey("InterfaceDr"))
  330. {
  331. joInparam.Add("InterfaceDr", Global.inf.interfaceDr);
  332. }
  333. joInparam.Add("params", JArray.FromObject(jaParam));
  334. joInparam.Add("session", Global.curEvt.jaSession);
  335. return joInparam;
  336. }
  337. catch (Exception ex)
  338. {
  339. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  340. }
  341. }
  342. /// <summary>
  343. /// 组织Iris入参
  344. /// </summary>
  345. /// <param name="code"></param>
  346. /// <param name="joParam"></param>
  347. /// <returns></returns>
  348. public static JObject setIrisInpar(string code, JArray jaParams)
  349. {
  350. try
  351. {
  352. dynamic joInparam = new JObject();
  353. if (!joInparam.ContainsKey("interfaceDr"))
  354. {
  355. joInparam.Add("interfaceDr", Global.inf.interfaceDr);
  356. }
  357. if (!joInparam.ContainsKey("hospitalDr"))
  358. {
  359. joInparam.Add("hospitalDr", Global.inf.hospitalDr);
  360. }
  361. joInparam.code = code;
  362. dynamic joTmp = new JObject();
  363. joInparam.Add("params", jaParams);
  364. joInparam.Add("session", Global.curEvt.jaSession);
  365. return joInparam;
  366. }
  367. catch (Exception ex)
  368. {
  369. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  370. }
  371. }
  372. /// <summary>
  373. /// 解析中心返参
  374. /// </summary>
  375. /// <param name="joRtn"></param>
  376. /// <param name="errorMsg"></param>
  377. /// <returns></returns>
  378. public static int parseCenterRtnValue(JObject joRtn, out string errorMsg)
  379. {
  380. try
  381. {
  382. string errcode = getDestValue(joRtn, "errcode");
  383. string errorCode = getDestValue(joRtn, "errorCode");
  384. string resultCode = getDestValue(joRtn, "resultcode");
  385. if (!string.IsNullOrEmpty(errcode))
  386. {
  387. errorMsg = getDestValue(joRtn, "errmsg");
  388. return -1;
  389. }
  390. else if (!string.IsNullOrEmpty(errorCode))
  391. {
  392. errorMsg = getDestValue(joRtn, "errorMessage");
  393. return -2;
  394. }
  395. else if (!string.IsNullOrEmpty(resultCode))
  396. {
  397. errorMsg = getDestValue(joRtn, "resulttext");
  398. return -3;
  399. }
  400. else
  401. {
  402. errorMsg = getDestValue(joRtn, "err_msg");
  403. return int.Parse(getDestValue(joRtn, "infcode"));
  404. }
  405. }
  406. catch (Exception ex)
  407. {
  408. errorMsg = "解析中心返参发生异常:" + ex.Message;
  409. return -1;
  410. }
  411. }
  412. /// <summary>
  413. /// 解析移动返参
  414. /// </summary>
  415. /// <param name="joRtn"></param>
  416. /// <param name="errorMsg"></param>
  417. /// <returns></returns>
  418. public static int parseMPRtnValue(JObject joRtn, out string errorMsg)
  419. {
  420. try
  421. {
  422. string success = getDestValue(joRtn, "success");
  423. string message = getDestValue(joRtn, "message");
  424. string encData = getDestValue(joRtn, "encData");
  425. if (string.IsNullOrEmpty(message)) {
  426. message = getDestValue(joRtn, "errorMessage");
  427. }
  428. //Global.writeLog("success:" + success);
  429. if (success != "True")
  430. {
  431. errorMsg = message;
  432. return -1;
  433. }
  434. else
  435. {
  436. errorMsg = joRtn.ToString();
  437. return 0;
  438. }
  439. }
  440. catch (Exception ex)
  441. {
  442. errorMsg = "解析中心返参发生异常:" + ex.Message;
  443. return -1;
  444. }
  445. }
  446. /// <summary>
  447. /// 组织IRIS返参
  448. /// </summary>
  449. /// <param name="errorCode"></param>
  450. /// <param name="errorMessage"></param>
  451. /// <param name="joResult"></param>
  452. /// <returns></returns>
  453. public static JObject setIrisReturnValue(int errorCode, string errorMessage, JObject joResult)
  454. {
  455. try
  456. {
  457. dynamic joRtn = new JObject();
  458. joRtn.errorCode = errorCode;
  459. joRtn.errorMessage = errorMessage;
  460. joRtn.Add("result", joResult);
  461. return joRtn;
  462. }
  463. catch (Exception ex)
  464. {
  465. return setExceptionJson(-1, "setIrisReturnValue:", ex.Message);
  466. }
  467. }
  468. /// <summary>
  469. /// 解析IRIS返参
  470. /// </summary>
  471. /// <param name="joRtn"></param>
  472. /// <param name="errorMsg"></param>
  473. /// <returns></returns>
  474. ///
  475. public static int parseIrisRtnValue(JObject joRtn, out string errorMsg)
  476. {
  477. try
  478. {
  479. errorMsg = getDestValue(joRtn, "errorMessage");
  480. return int.Parse(getDestValue(joRtn, "errorCode"));
  481. }
  482. catch (Exception ex)
  483. {
  484. errorMsg = "解析Iris返参发生异常:" + ex.Message;
  485. return -1;
  486. }
  487. }
  488. public static int parseIrisRtnResult(JObject joRtn, out string result)
  489. {
  490. try
  491. {
  492. int iResult = int.Parse(getDestValue(joRtn, "errorCode"));
  493. if (iResult == 0)
  494. {
  495. result = getDestValue(joRtn, "result");
  496. }
  497. else
  498. {
  499. result = getDestValue(joRtn, "errorMessage");
  500. }
  501. return iResult;
  502. }
  503. catch (Exception ex)
  504. {
  505. result = "解析Iris返参发生异常:" + ex.Message;
  506. return -1;
  507. }
  508. }
  509. /// <summary>
  510. /// 解析业务JSON串(业务串固定格式为{errorCode = ,errorMessage = ,result ={}})
  511. /// </summary>
  512. /// <param name="json"></param>
  513. /// <param name="errorMsg"></param>
  514. /// <returns></returns>
  515. public static int parseCenterReturnJson(JObject json, out string errorMsg)
  516. {
  517. try
  518. {
  519. errorMsg = "";
  520. if (int.Parse(json["infcode"].ToString()) != 0)
  521. {
  522. errorMsg = json["err_msg"].ToString();
  523. }
  524. return int.Parse(json["infcode"].ToString());
  525. }
  526. catch (Exception ex)
  527. {
  528. errorMsg = "parseCenterReturnJson" + ex.Message;
  529. return -1;
  530. }
  531. }
  532. /// <summary>
  533. /// 组织中心入参-医保电子处方流转
  534. /// </summary>
  535. /// <param name="infno"></param>
  536. /// <param name="input"></param>
  537. /// <returns></returns>
  538. public static string setCenterInparPresCirNew(JObject data)
  539. {
  540. EncryptHelper encrypt = new EncryptHelper(Global.inf.MobilePay.appid, Global.inf.MobilePay.secretKey, Global.inf.MobilePay.publicKey, Global.inf.MobilePay.privateKey);
  541. string txtData = JsonHelper.toJsonString(data);
  542. string plainText = SignUtil.SortInput(data);
  543. Global.writeLog("【明文入参】:\r\n" + plainText);
  544. string signData = "";
  545. string output = encrypt.encrypt(txtData, ref signData);
  546. Global.writeLog("【密文入参】:\r\n" + output);
  547. return output;
  548. }
  549. /// <summary>
  550. /// 解析中心返参
  551. /// </summary>
  552. /// <param name="joRtn"></param>
  553. /// <param name="errorMsg"></param>
  554. /// <returns></returns>
  555. public static int parseEPCenterRtnValue(JObject joRtn, out string errorMsg)
  556. {
  557. try
  558. {
  559. string errcode = getDestValue(joRtn, "errcode");
  560. string errorCode = getDestValue(joRtn, "errorCode");
  561. if (errcode != "")
  562. {
  563. errorMsg = getDestValue(joRtn, "message");
  564. return -1;
  565. }
  566. else if (errorCode != "")
  567. {
  568. errorMsg = getDestValue(joRtn, "errorMessage");
  569. return -2;
  570. }
  571. else
  572. {
  573. errorMsg = getDestValue(joRtn, "message");
  574. return int.Parse(getDestValue(joRtn, "code"));
  575. }
  576. }
  577. catch (Exception ex)
  578. {
  579. errorMsg = "解析中心返参发生异常:" + ex.Message;
  580. return -1;
  581. }
  582. }
  583. }
  584. }