当前位置:   article > 正文

三种方式提取Json字符串中对应的属性值集合, 正则\newtonsoft.net_截取json串中某个属性的值

截取json串中某个属性的值

 项目中经常使用抓取,有些接口返回的是html,我解析是使用NSoup。

但大部分接口返回使用的Json。

下面我针对json 编写了三方方法,都是用于提取属性结果的

方法1.使用的是JsonPath,配置规则详见:

newtonsoft官网文档

https://www.newtonsoft.com/json/help/html/QueryJsonSelectToken.htm

List<string> resLS = NSoupHelper.GetJsonListStrBySelector(jsonStr, "$..rows[*].newsTitle");

方法2.使用的是正则表达式提取,遍历后返回命中结果

按照json路径传参即可

List<string> regLS = NSoupHelper.GetJsonListStrByRegex(jsonStr, "ROOT rows newsTitle");

方法3.使用的是JToken判断,遍历返回命中结果

按照json路径传参即可

List<string> resLS2 = NSoupHelper.GetJsonListStrBySelector2(jsonStr, "ROOT rows newsTitle");

三种结果都是一致的:

源码

  1. #region Json
  2. /// <summary>
  3. /// 根据JsonPath 获取json字符串的相应字段集合
  4. /// </summary>
  5. /// <param name="_JsonResult"></param>
  6. /// <param name="_getSelector">$..Products[?(@.Price >= 50)].Name、$..rows[*].newsTitle</param>
  7. /// <returns></returns>
  8. public static List<string> GetJsonListStrBySelector(string _JsonResult, string _getSelector)
  9. {
  10. List<string> _listS = new List<string>();
  11. if (string.IsNullOrEmpty(_JsonResult) || string.IsNullOrEmpty(_getSelector)) { return _listS; }
  12. try
  13. {
  14. JObject _BaseJobject = JsonConvert.DeserializeObject<JObject>(_JsonResult);
  15. IEnumerable<JToken> checkedToken = _BaseJobject.SelectTokens(_getSelector);
  16. foreach (JToken item in checkedToken)
  17. {
  18. _listS.Add(item.ToString());
  19. }
  20. //https://www.newtonsoft.com/json/help/html/QueryJsonSelectToken.htm
  21. }
  22. catch { }
  23. return _listS;
  24. }
  25. /// <summary>
  26. /// 根据Selector表达式获取json字符串的相应字段集合 ,原理 正则表达式
  27. /// </summary>
  28. /// <param name="_JsonResult"></param>
  29. /// <param name="_getSelector">逐级 如:ROOT rows newsTitle</param>
  30. /// <returns></returns>
  31. public static List<string> GetJsonListStrByRegex(string _JsonResult, string _getSelector)
  32. {
  33. List<string> _listS = new List<string>();
  34. if (string.IsNullOrEmpty(_JsonResult) || string.IsNullOrEmpty(_getSelector)) { return _listS; }
  35. //处理单引号问题
  36. if (_JsonResult.IndexOf('\'') > 0)
  37. {
  38. _JsonResult= JsonConvert.SerializeObject(JsonConvert.DeserializeObject<JObject>(_JsonResult));
  39. }
  40. try
  41. {
  42. List<string> hitStrs = new List<string>();
  43. string[] jPaths = _getSelector.Split(' ');
  44. JToken jt = null;
  45. for (int i = 0; i < jPaths.Length; i++)
  46. {
  47. string jp = jPaths[i];
  48. string[] _l_JFH = new string[] { "[", "{","\"" ,":" };
  49. string[] _r_FH = new string[] { "]", "}", "\"", ",}" };
  50. if (i == 0)
  51. {
  52. for (int i2 = 0; i2 < _l_JFH.Length; i2++)
  53. {
  54. Regex reg = new Regex(string.Format("\"{2}\"[^\\{0}\\{1},]*\\{0}(?<json>[^\\{0}\\{1}]*(((?'Open'\\{0})[^\\{0}\\{1}]*)+((?'-Open'\\{1})[^\\{0}\\{1}]*)+)*?(?(Open)(?!))*[^\\{0}\\{1}]*)[\\{1}]", _l_JFH[i2], _r_FH[i2], jp));
  55. MatchCollection ms = reg.Matches(_JsonResult);
  56. foreach (Match _m in ms)
  57. {
  58. hitStrs.Add(_m.Groups["json"]?.Value);
  59. }
  60. if (ms.Count > 0)
  61. {
  62. break;
  63. }
  64. }
  65. if (i == jPaths.Length - 1)
  66. {
  67. _listS = hitStrs;
  68. }
  69. }
  70. else if (i == jPaths.Length - 1)
  71. {
  72. //最后一个层级
  73. foreach (string _nowStr in hitStrs)
  74. {
  75. for (int i2 = 0; i2 < _l_JFH.Length; i2++)
  76. {
  77. Regex reg = new Regex(string.Format("\"{2}\"[^\\{0}\\{1},]*\\{0}(?<json>[^\\{0}\\{1}]*(((?'Open'\\{0})[^\\{0}\\{1}]*)+((?'-Open'\\{1})[^\\{0}\\{1}]*)+)*?(?(Open)(?!))*[^\\{0}\\{1}]*)[\\{1}]", _l_JFH[i2], _r_FH[i2], jp));
  78. MatchCollection ms = reg.Matches(_nowStr);
  79. foreach (Match _m in ms)
  80. {
  81. _listS.Add(_m.Groups["json"]?.Value);
  82. }
  83. if (ms.Count > 0)
  84. {
  85. break;
  86. }
  87. }
  88. }
  89. }
  90. else
  91. {
  92. //中间层级
  93. List<string> gdStrs = new List<string>();
  94. foreach (string _nowStr in hitStrs)
  95. {
  96. for (int i2 = 0; i2 < _l_JFH.Length; i2++)
  97. {
  98. Regex reg = new Regex(string.Format("\"{2}\"[^\\{0}\\{1},]*\\{0}(?<json>[^\\{0}\\{1}]*(((?'Open'\\{0})[^\\{0}\\{1}]*)+((?'-Open'\\{1})[^\\{0}\\{1}]*)+)*?(?(Open)(?!))*[^\\{0}\\{1}]*)[\\{1}]", _l_JFH[i2], _r_FH[i2], jp));
  99. MatchCollection ms = reg.Matches(_nowStr);
  100. foreach (Match _m in ms)
  101. {
  102. gdStrs.Add(_m.Groups["json"]?.Value);
  103. }
  104. if (ms.Count > 0)
  105. {
  106. break;
  107. }
  108. }
  109. }
  110. hitStrs = gdStrs;
  111. }
  112. }
  113. }
  114. catch { }
  115. return _listS;
  116. }
  117. /// <summary>
  118. /// 根据Selector表达式获取json字符串的相应字段集合 ,原理 JToken逐级遍历
  119. /// </summary>
  120. /// <param name="_doc"></param>
  121. /// <param name="_getSelector">逐级 如:ROOT rows newsTitle</param>
  122. /// <returns></returns>
  123. public static List<string> GetJsonListStrBySelector2(string _JsonResult, string _getSelector)
  124. {
  125. List<string> _listS = new List<string>();
  126. if (string.IsNullOrEmpty(_JsonResult) || string.IsNullOrEmpty(_getSelector)) { return _listS; }
  127. //处理单引号问题
  128. if (_JsonResult.IndexOf('\'') > 0)
  129. {
  130. _JsonResult = JsonConvert.SerializeObject(JsonConvert.DeserializeObject<JObject>(_JsonResult));
  131. }
  132. try
  133. {
  134. JToken _BaseJobject = JsonConvert.DeserializeObject<JToken>(_JsonResult);
  135. JToken _ppJObject = _BaseJobject;
  136. string[] jPaths = _getSelector.Split(' ');
  137. //命中集合
  138. List<JToken> hitTokenList = new List<JToken>();
  139. for (int i=0;i<jPaths.Length;i++)
  140. {
  141. //第一步匹配
  142. if (i == 0)
  143. {
  144. JToken jt = _BaseJobject[jPaths[i]];
  145. if (jt == null || jt.Type == JTokenType.Null)
  146. {
  147. return _listS;
  148. }
  149. if (jt.Type == JTokenType.Array)
  150. {
  151. foreach (var _jt in (JArray)jt)
  152. {
  153. hitTokenList.Add(_jt);
  154. }
  155. }
  156. else
  157. {
  158. hitTokenList.Add(jt);
  159. }
  160. if (i == jPaths.Length - 1)
  161. {
  162. //最后一个层级
  163. foreach (JToken _nowJT in hitTokenList)
  164. {
  165. //肯定不是Array,是的话 不支持匹配 如:[[1,2,3],[4,5,6]]
  166. JToken jt_next = _nowJT[jPaths[i]];
  167. if (jt_next == null || jt_next.Type == JTokenType.Null)
  168. {
  169. //不是最后一个层级,却出现null 直接返回
  170. return _listS;
  171. }
  172. if (jt_next.Type == JTokenType.Array)
  173. {
  174. foreach (var _jt in (JArray)jt_next)
  175. {
  176. _listS.Add(_jt.ToString());
  177. }
  178. }
  179. else
  180. {
  181. _listS.Add(jt_next.ToString());
  182. }
  183. }
  184. }
  185. }
  186. else if (i == jPaths.Length-1)
  187. {
  188. //最后一个层级
  189. foreach (JToken _nowJT in hitTokenList)
  190. {
  191. //肯定不是Array,是的话 不支持匹配 如:[[1,2,3],[4,5,6]]
  192. JToken jt_next = _nowJT[jPaths[i]];
  193. if (jt_next == null || jt_next.Type == JTokenType.Null)
  194. {
  195. //不是最后一个层级,却出现null 直接返回
  196. return _listS;
  197. }
  198. if (jt_next.Type == JTokenType.Array)
  199. {
  200. foreach (var _jt in (JArray)jt_next)
  201. {
  202. _listS.Add(_jt.ToString());
  203. }
  204. }
  205. else
  206. {
  207. _listS.Add(jt_next.ToString());
  208. }
  209. }
  210. }
  211. else
  212. {
  213. //中间层级阶段
  214. List<JToken> bxTokens = new List<JToken>();
  215. foreach (JToken _nowJT in hitTokenList)
  216. {
  217. //肯定不是Array,是的话 不支持匹配 如:[[1,2,3],[4,5,6]]
  218. JToken jt_next = _nowJT[jPaths[i]];
  219. if (jt_next == null || jt_next.Type == JTokenType.Null)
  220. {
  221. //不是最后一个层级,却出现null 直接返回
  222. return _listS;
  223. }
  224. if (jt_next.Type == JTokenType.Array)
  225. {
  226. foreach (var _jt in (JArray)jt_next)
  227. {
  228. bxTokens.Add(_jt);
  229. }
  230. }
  231. else
  232. {
  233. bxTokens.Add(jt_next);
  234. }
  235. }
  236. hitTokenList = bxTokens;
  237. }
  238. }
  239. }
  240. catch { }
  241. return _listS;
  242. }
  243. #endregion

参考json

 

  1. string jsonStr = @"{ 'ROOT':[{
  2. 'TOKEN': 'aa1',
  3. 'SERVICE': 'bb',
  4. 'DATAPARAM': 'cc',
  5. 'rows': [
  6. {
  7. 'searchValue': null,
  8. 'createBy': '用户N',
  9. 'createTime': '2021-02-25 11:06:03',
  10. 'updateBy': null,
  11. 'updateTime': null,
  12. 'remark': null,
  13. 'params': {},
  14. 'newsId': 241,
  15. 'newsTitle': 'IPASON × GUNDAM攀升高达联名独角兽电竞主机达抵达战场',
  16. 'newsSubtitle': '#光芒闪耀,攀升AMD 3A配置独角兽登场# IPASON × GUNDAM攀升高达联名独角兽电竞主机达抵达战场!2月24日 20:00,预售开启。搭载AMD 锐龙 5000系列处理器和AMD Radeon RX 6000系列显卡,旗舰硬件核心让你体验热血电竞与高达情怀的双重满足!上天猫、京东搜索高达攀升,了解#高达主机# 一起去唤醒并激发心中少年的勇气,男人的浪漫。',
  17. 'newsUrl': null,
  18. 'releaseTime': '2021-02-24',
  19. 'newsSource': '官方',
  20. 'showOrder': '43',
  21. 'showStatus': '0',
  22. 'newsImg': 'http://ipasoncnwebsite.oss-cn-shanghai.aliyuncs.com/images/79049291-16f3-4407-a34f-80fbc3193920.jpg',
  23. 'newsCategory': 'category_qiyexinwen'
  24. },
  25. {
  26. 'searchValue': null,
  27. 'createBy': '用户N',
  28. 'createTime': '2021-01-19 16:55:27',
  29. 'updateBy': null,
  30. 'updateTime': null,
  31. 'remark': null,
  32. 'params': {},
  33. 'newsId': 239,
  34. 'newsTitle': '高性能定制电脑攀升',
  35. 'newsSubtitle': '高性能定制电脑攀升',
  36. 'newsUrl': null,
  37. 'releaseTime': '2021-02-24',
  38. 'newsSource': '官方',
  39. 'showOrder': '40',
  40. 'showStatus': '0',
  41. 'newsImg': 'http://ipasoncnwebsite.oss-cn-shanghai.aliyuncs.com/images/6b96c7ee-5f15-490c-a140-727da068a62b.png',
  42. 'newsCategory': 'category_qiyexinwen'
  43. },
  44. {
  45. 'searchValue': null,
  46. 'createBy': '用户N',
  47. 'createTime': '2021-01-15 10:33:47',
  48. 'updateBy': null,
  49. 'updateTime': null,
  50. 'remark': null,
  51. 'params': {},
  52. 'newsId': 237,
  53. 'newsTitle': '攀升电脑2020年度荣誉时刻',
  54. 'newsSubtitle': '攀升电脑2020年度荣誉时刻',
  55. 'newsUrl': 'https://tieba.baidu.com/p/7190803603',
  56. 'releaseTime': '2021-01-15',
  57. 'newsSource': '官方',
  58. 'showOrder': '37',
  59. 'showStatus': '0',
  60. 'newsImg': 'http://ipasoncnwebsite.oss-cn-shanghai.aliyuncs.com/images/01b99cf5-e51f-43a1-8478-72ebfb38de9c.jpg',
  61. 'newsCategory': 'category_qiyexinwen'
  62. }
  63. ]
  64. }, {
  65. 'TOKEN': 'c2',
  66. 'SERVICE': 'bb',
  67. 'DATAPARAM': 'cc',
  68. 'rows': [
  69. {
  70. 'searchValue': null,
  71. 'createBy': '用户N',
  72. 'createTime': '2021-02-25 11:06:03',
  73. 'updateBy': null,
  74. 'updateTime': null,
  75. 'remark': null,
  76. 'params': {},
  77. 'newsId': 241,
  78. 'newsTitle': 'IPASON × GUNDAM攀升高达联名独角兽电竞主机达抵达战场',
  79. 'newsSubtitle': '#光芒闪耀,攀升AMD 3A配置独角兽登场# IPASON × GUNDAM攀升高达联名独角兽电竞主机达抵达战场!2月24日 20:00,预售开启。搭载AMD 锐龙 5000系列处理器和AMD Radeon RX 6000系列显卡,旗舰硬件核心让你体验热血电竞与高达情怀的双重满足!上天猫、京东搜索高达攀升,了解#高达主机# 一起去唤醒并激发心中少年的勇气,男人的浪漫。',
  80. 'newsUrl': null,
  81. 'releaseTime': '2021-02-24',
  82. 'newsSource': '官方',
  83. 'showOrder': '43',
  84. 'showStatus': '0',
  85. 'newsImg': 'http://ipasoncnwebsite.oss-cn-shanghai.aliyuncs.com/images/79049291-16f3-4407-a34f-80fbc3193920.jpg',
  86. 'newsCategory': 'category_qiyexinwen'
  87. },
  88. {
  89. 'searchValue': null,
  90. 'createBy': '用户N',
  91. 'createTime': '2021-01-19 16:55:27',
  92. 'updateBy': null,
  93. 'updateTime': null,
  94. 'remark': null,
  95. 'params': {},
  96. 'newsId': 239,
  97. 'newsTitle': '高性能制电脑攀升',
  98. 'newsSubtitle': '高性能定制电脑攀升',
  99. 'newsUrl': null,
  100. 'releaseTime': '2021-02-24',
  101. 'newsSource': '官方',
  102. 'showOrder': '40',
  103. 'showStatus': '0',
  104. 'newsImg': 'http://ipasoncnwebsite.oss-cn-shanghai.aliyuncs.com/images/6b96c7ee-5f15-490c-a140-727da068a62b.png',
  105. 'newsCategory': 'category_qiyexinwen'
  106. },
  107. {
  108. 'searchValue': null,
  109. 'createBy': '用户N',
  110. 'createTime': '2021-01-15 10:33:47',
  111. 'updateBy': null,
  112. 'updateTime': null,
  113. 'remark': null,
  114. 'params': {},
  115. 'newsId': 237,
  116. 'newsTitle': '攀升电脑2020年度荣誉时刻',
  117. 'newsSubtitle': '攀升电脑2020年度荣誉时刻',
  118. 'newsUrl': 'https://tieba.baidu.com/p/7190803603',
  119. 'releaseTime': '2021-01-15',
  120. 'newsSource': '官方',
  121. 'showOrder': '37',
  122. 'showStatus': '0',
  123. 'newsImg': 'http://ipasoncnwebsite.oss-cn-shanghai.aliyuncs.com/images/01b99cf5-e51f-43a1-8478-72ebfb38de9c.jpg',
  124. 'newsCategory': 'category_qiyexinwen'
  125. }
  126. ]
  127. }]
  128. }";

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/485487
推荐阅读
相关标签
  

闽ICP备14008679号