用原始方法解析复杂字符串,json一定要用JsonMapper么?
以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用JsonMapper,解析为字典格式。不过没用过,习惯了用最原始的方法来解析字符串,所以这里分享几个解析的案例。也许会有点作用。
解析字符串最常用的应该是Splite和Replace了。分割,然后替换一些引号之类的。最后组合。特别是采集的时候,经常会把html页面中某一段要提取出来,可能很多人用正则表达式,可是不会啊,也不愿意去学。那只好用这些原始的方法了,时间久了,也积累一些经验或者函数。看看几个例子。
1.不规则非json字符串
先看看这个例子,字符串是连在一起,没有换行的,为了方便观察,换行了,程序是原始在一起的:
[11101630,1532,14,'0','0',3,'2015,4,23,16,05,48','4',1,2,0,0],
[11101631,1532,14,'0','0',3,'2015,4,23,16,09,48','0',,,0,0],
[11101632,1532,14,'0','0',3,'2015,4,23,16,03,10','1',2,2,0,0]
先来分析一下这个字符串的特点,才能找到思路哦:
1.每一组数据都是在[]括号对中,每一组数据用,号分割,所以最终要形成一个数组来访问哦。
2.每一组的数据基本都是用 , 号分割,字符串类型还有单引号 ;
3.第7个数组是一个整体,也使用,号分割,整体是字符串有引号;
4.第2组数据有空值,直接用,号分割,所以splite的时候不能去掉空值,否则数组长度不一样,定位就乱了。
既然分析都完了,那思路呢?
1.组直接分割使用 ], 标记,然后每一组要Repalce掉 [ 和 ] 。主要是最前和最后;
2.组内分割,使用 ,号标记分割,出来之前要把单引号给 替换掉 ;不然也是作为字符串,引号也包括进去了;
3.至于那个 数组 的处理,不能过于想复杂,分割之后,直接在最后增加1个元素,将固定位置7-12的组合起来;这样也许方便点;
4.由于空值有占位,所以每一组的长度是固定的。所以处理的时候直接根据自己想要的位置来组合。
下面看看代码了,C#版本,相对与一行代码,仔细看,Linq很是一个神器,真的是神奇。。。说多了都是泪,为啥就没早点学呢:
String str = @"[11101630,1532,14,'0','0',3,'2015,4,23,16,05,48','4',1,2,0,0],[11101631,1532,14,'0','0',3,'2015,4,23,16,09,48','0',,,0,0],[11101632,1532,14,'0','0',3,'2015,4,23,16,03,10','1',2,2,0,0]";var result = str.Split(new string[] { "]," }, StringSplitOptions.None) //先整体分割组.Select(n => n.Replace("[", "") //以下是组内分割,并去掉其他干扰字符.Replace("]", "").Replace("\'", "").Split(',').ToList()).Select(n => //对中间一个整体单独提取,进行组合,单独增加一个元素{n.Add(String.Format("{0},{1},{2},{3},{4},{5}", n[6], n[7], n[8], n[9], n[10], n[11]));return n;}).ToList();
看看结果怎么样:
2.键值对字符串分割函数
由于json数据格式都是键值对字符串,所以这里特意分享一个经常用到的分割函数,不用Json组件,那就用简单的方法做一个。这个函数来源于Newlife.Core,是X组件的重要部分。源码部分不过多解释,就是按规则将键值对直接分割保持在字典中,使用方法大家可以自己实验一下,或者参考下面的案例,都有用到这个方法。代码如下,为了方便使用,写成了扩展方法:
public static class StringHelper {/// <summary>拆分字符串成为名值字典</summary>/// <param name="str">要分割字符串的</param>/// <param name="nameValueSeparator">键值对的分隔符</param>/// <param name="separators">分割字符</param>/// <returns>键值对字典</returns>public static IDictionary<String, String> SplitAsDictionary(this String str, String nameValueSeparator = "=", params String[] separators){var dic = new Dictionary<String, String>();if (String.IsNullOrWhiteSpace(str)) return dic;if (String.IsNullOrEmpty(nameValueSeparator)) nameValueSeparator = "=";if (separators == null || separators.Length < 1) separators = new String[] { ",", ";" };String[] ss = str.Split(separators, StringSplitOptions.RemoveEmptyEntries);if (ss == null || ss.Length < 1) return null;foreach (var item in ss){Int32 p = item.IndexOf(nameValueSeparator);// 在前后都不行if (p <= 0 || p >= item.Length - 1) continue;String key = item.Substring(0, p).Trim();dic[key] = item.Substring(p + nameValueSeparator.Length).Trim();}return dic;} }
上面默认的键值对分割符号为 = 号,根据实际情况进行修改,json格式里面一般是:冒号比较多。
3.复杂Json格式的字符串
上面的例子比较简单,这次看一个稍微复杂点的,虽然可能用JsonMapper可以很轻易做到,但试一下最原始的方法吧。还是按照上面的思路,先分析字符串的特点:字符串是连在一起,没有换行的,为了方便观察,换行了,程序是原始在一起的:
{1074:['墨聯','墨联','MEX D1','#098000','98'],2100:['美乙','美乙','USL D2','#E89B10','98'],1024:['阿甲','阿甲','ARG','#00CCFF','98'],1052:['哥倫甲','哥伦甲','COLCMA','#888500','98'],1028:['K聯賽','K联赛','KORL','#F75000','98'],1297:['球會友誼','球会友谊','CF','#5691D8','98'],2085:['奧女甲','奧女甲','AFB','#D86220','97']}
还是先分析特点,这个格式应该是json类似的了,比较规则:
组与之间是使用 , 号分割;前后有{}括号对;观察前后可以使用 ], 字符串将组分开;
键 是整数,键值是通过 : 号分割;
值是一个数组,有5个元素,通过 , 号分割
都有单引号,需要过滤掉;其他没有特殊情况;
代码解决过程:
string text = @"{1074:['墨聯','墨联','MEX D1','#098000','98'],2100:['美乙','美乙','USL D2','#E89B10','98'],1024:['阿甲','阿甲','ARG','#00CCFF','98'],1052:['哥倫甲','哥伦甲','COLCMA','#888500','98'],1028:['K聯賽','K联赛','KORL','#F75000','98'],1297:['球會友誼','球会友谊','CF','#5691D8','98'],2085:['奧女甲','奧女甲','AFB','#D86220','97']}"; var dic = text.Replace("\'", "").Split(new String[]{"],"}, StringSplitOptions.None) //先组分割.Select(n => n.Replace("{", "").Replace("}", "") //将组里面的干扰字符过滤掉.Replace("[", "").Replace("]", "").SplitAsDictionary(":", "\"") //键值对处理,冒号分隔符.ToDictionary(t => t.Key, t => t.Value.Split(',')//值再次进行分割,形成数组)).ToArray();
看看结果如何:
4.标准的json格式
在实际的采集过,可能会碰到直接url,返回的就是json格式,比较标准。这里举个例子,如下面这个页面链接:
http://d.dacai.com/zhishu/CorrectCorp.html?matchId=1899040&matchStatusId=41
点击开后,是这个样子:
这个应该够复杂了,我们分析一下,篇幅较大,源码对照链接:
每一大组数据,是用,号分割;整体也是前后大括号对{},有4个大类,键分布是:IndBodans,IndEvenGoals,IndGoalss,IndHalfFulls。
每一组的子类中,包括的都是同一个类型的数据,每一个子数据组都有N多个小的键值对,如MatchId,CorpId等等,使用},可以分割
分析完成之后如何解决,思路是类似的,先整体分割,使用},进行,然后每一个之类作为键,对值再次进行分割。。。形成字典列表。其中的引号也是需要过滤的,至于数值类型,实际用到那个的时候,都是根据key去找,再进行Convert转换就可以了。看看源代码:
var dicList = doc.Split("{\"IndBodans\":[", "],\"IndEvenGoals\":[", //大类分割"],\"IndGoalss\":[", "],\"IndHalfFulls\":[", "]}").Select(n => n.Replace("\"", "").Split("},{")//对每个大类处理,先过滤,再分割为子类.Select(k => k.Replace("{", "").Replace("}", "")//对子类过滤.SplitAsDictionary(":", ","))//提取子类的键值对.ToArray()).ToList();//列表
看看解析的结果如何:
注意,有元素是空值的,可以不用管。至于那几个键值对数组,最终属于哪一个大类?虽然没有直接标记出来,但是这个问题随便加一个判断就可以了,因为每一个类别的键名称是不一样的,看看是否包括对应的键就可以确定类别。
5.总结
虽然过程很简单,也许有更简单的办好,直接和实体类映射,json反序列化更方便,但有时候没有实体类,也挺麻烦。特别是这种变态复杂的,jsonmap直接处理不知道行不行。总之本文的目的是尽可能使用简单原始的方法来解决问题,也是一个思路。虽然有时候我很懒,喜欢用开源组件,但有的时候一旦用上原始的了,也不喜欢改了。
字符串分析处理的过程虽然繁琐,但基本都是比较简单的,细致一点,都不是事。
最后把这个测试的源代码发上来,大家别忘了点赞哦。。。
源代码:SpliteAsDictionaryDemo.rar
用原始方法解析复杂字符串,json一定要用JsonMapper么?相关推荐
- 转js 将json字符串转换为json对象的方法解析
将json字符串转换为json对象的方法.在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键 我的解决思路是: ...
- jquery parseJSON()方法解析json字符串
在web项目开发中,前端经常需要接收后端传送来的json数据,解析json字符串,再对页面进行渲染.使用jquery解析json字符串通常需要将json字符串转化为javascript的json对象( ...
- js 将json字符串转换为json对象的方法解析
将json字符串转换为json对象的方法.在数据传输过程中,json是以文本,即字符串的形式传递的,而JS操作的是JSON对象,所以,JSON对象和JSON字符串之间的相互转换是关键 例如: JSON ...
- 转:js 将json字符串转换为json对象的方法解析
例如: JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; J ...
- Gin 框架学习笔记(01)— 自定义结构体绑定表单、绑定URI、自定义log、自定义中间件、路由组、解析查询字符串、上传文件、使用HTTP方法
要实现一个 API 服务器,首先要考虑两个方面:API 风格和媒体类型.Go 语言中常用的 API 风格是 RPC 和 REST,常用的媒体类型是 JSON.XML 和 Protobuf.在 Go A ...
- 字符串不替代_使用第三方库demjson解析不规范的json字符串
Json在编程中是一种轻量级的文件格式,在本地开发或者web开发中使用较多.JSON(JavaScript Object Notation,JavaScript对象表示法,读作/ˈdʒeɪsən/)是 ...
- java解析多层嵌套json字符串
java解析多层嵌套json字符串 java分别解析下面两个json字符串 package jansonDemo;import com.alibaba.fastjson.JSON; import co ...
- json解析和字符串解析_高效创建和解析定界字符串
json解析和字符串解析 描述 (Description) Converting a delimited string into a dataset or transforming it into u ...
- java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串
文章目录 1. 详说json 1.1 何为json 1.2 json语法 2. Java解析与生成JSON的四种方式 2.1 传统方式 2.2 利用Jackson方式 2.3 利用Gson方式 2.4 ...
最新文章
- 推荐44个最具潜力的顶极深度学习开源框架和平台!!!
- CTFshow php特性 web150
- 【数学建模】MATLAB应用实战系列(九十一)-熵权法应用案例(附MATLAB和Python代码)
- hdu 3948(后缀数组+RMQ)
- 2012-01-10 自己写的基于jquery的翻页效果
- POJ - 3257 Cow Roller Coaster (背包)
- Effective C++: 06继承与面向对象设计
- 腾讯财报中“最大秘密”:2018云收入91亿元,交首份TO B答卷
- java已被弱化签名,高效Java第四十条建议:谨慎设计方法签名
- jQuery Mobile教程:jQuery Mobile基本事件
- 浅析继承关系中的方法调用
- 重返商用计算市场,紫光计算机要做数字化转型生意
- 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_12_注解_概念
- 智能公租房管理系统概要流程
- JSP中把动态页面转换为静态页面
- 低版本ie浏览器禁用提示
- 软考高项——配置管理
- Elasticsearch数据读写过程
- 预测股市?echart折线图展示CPI,PPI剪刀差和股市的关系
- Event loop/浏览器的事件循环机制