天天看点

用原始方法解析复杂字符串,json一定要用JsonMapper么?1.不规则非json字符串2.键值对字符串分割函数3.复杂Json格式的字符串4.标准的json格式5.总结

    经常采集数据,肯定会碰到解析字符串,包括整个页面的html,或者json以及一些不标准的json格式。。。

    以前用json序列化,有时候需要实体类,有的时候没有,比较麻烦,听说可以用jsonmapper,解析为字典格式。不过没用过,习惯了用最原始的方法来解析字符串,所以这里分享几个解析的案例。也许会有点作用。

    解析字符串最常用的应该是splite和replace了。分割,然后替换一些引号之类的。最后组合。特别是采集的时候,经常会把html页面中某一段要提取出来,可能很多人用正则表达式,可是不会啊,也不愿意去学。那只好用这些原始的方法了,时间久了,也积累一些经验或者函数。看看几个例子。

    先看看这个例子,字符串是连在一起,没有换行的,为了方便观察,换行了,程序是原始在一起的:

    先来分析一下这个字符串的特点,才能找到思路哦:

1.每一组数据都是在[]括号对中,每一组数据用,号分割,所以最终要形成一个数组来访问哦。

2.每一组的数据基本都是用 , 号分割,字符串类型还有单引号 ;

3.第7个数组是一个整体,也使用,号分割,整体是字符串有引号;

4.第2组数据有空值,直接用,号分割,所以splite的时候不能去掉空值,否则数组长度不一样,定位就乱了。

    既然分析都完了,那思路呢?

1.组直接分割使用  ], 标记,然后每一组要repalce掉 [  和 ] 。主要是最前和最后;

2.组内分割,使用  ,号标记分割,出来之前要把单引号给 替换掉 ;不然也是作为字符串,引号也包括进去了;

3.至于那个 数组 的处理,不能过于想复杂,分割之后,直接在最后增加1个元素,将固定位置7-12的组合起来;这样也许方便点;

4.由于空值有占位,所以每一组的长度是固定的。所以处理的时候直接根据自己想要的位置来组合。

    下面看看代码了,c#版本,相对与一行代码,仔细看,linq很是一个神器,真的是神奇。。。说多了都是泪,为啥就没早点学呢:

看看结果怎么样:

用原始方法解析复杂字符串,json一定要用JsonMapper么?1.不规则非json字符串2.键值对字符串分割函数3.复杂Json格式的字符串4.标准的json格式5.总结

  上面默认的键值对分割符号为 = 号,根据实际情况进行修改,json格式里面一般是:冒号比较多。

    上面的例子比较简单,这次看一个稍微复杂点的,虽然可能用jsonmapper可以很轻易做到,但试一下最原始的方法吧。还是按照上面的思路,先分析字符串的特点:字符串是连在一起,没有换行的,为了方便观察,换行了,程序是原始在一起的:

还是先分析特点,这个格式应该是json类似的了,比较规则:

组与之间是使用 , 号分割;前后有{}括号对;观察前后可以使用 ], 字符串将组分开;

键 是整数,键值是通过 : 号分割;

值是一个数组,有5个元素,通过 , 号分割

都有单引号,需要过滤掉;其他没有特殊情况;

代码解决过程:

看看结果如何:

用原始方法解析复杂字符串,json一定要用JsonMapper么?1.不规则非json字符串2.键值对字符串分割函数3.复杂Json格式的字符串4.标准的json格式5.总结

    在实际的采集过,可能会碰到直接url,返回的就是json格式,比较标准。这里举个例子,如下面这个页面链接:

<a href="http://d.dacai.com/zhishu/correctcorp.html?matchid=1899040&amp;matchstatusid=41">http://d.dacai.com/zhishu/correctcorp.html?matchid=1899040&amp;matchstatusid=41</a>

点击开后,是这个样子:

用原始方法解析复杂字符串,json一定要用JsonMapper么?1.不规则非json字符串2.键值对字符串分割函数3.复杂Json格式的字符串4.标准的json格式5.总结

这个应该够复杂了,我们分析一下,篇幅较大,源码对照链接:

每一大组数据,是用,号分割;整体也是前后大括号对{},有4个大类,键分布是:indbodans,indevengoals,indgoalss,indhalffulls。

每一组的子类中,包括的都是同一个类型的数据,每一个子数据组都有n多个小的键值对,如matchid,corpid等等,使用},可以分割

分析完成之后如何解决,思路是类似的,先整体分割,使用},进行,然后每一个之类作为键,对值再次进行分割。。。形成字典列表。其中的引号也是需要过滤的,至于数值类型,实际用到那个的时候,都是根据key去找,再进行convert转换就可以了。看看源代码:

看看解析的结果如何:

用原始方法解析复杂字符串,json一定要用JsonMapper么?1.不规则非json字符串2.键值对字符串分割函数3.复杂Json格式的字符串4.标准的json格式5.总结

注意,有元素是空值的,可以不用管。至于那几个键值对数组,最终属于哪一个大类?虽然没有直接标记出来,但是这个问题随便加一个判断就可以了,因为每一个类别的键名称是不一样的,看看是否包括对应的键就可以确定类别。

    虽然过程很简单,也许有更简单的办好,直接和实体类映射,json反序列化更方便,但有时候没有实体类,也挺麻烦。特别是这种变态复杂的,jsonmap直接处理不知道行不行。总之本文的目的是尽可能使用简单原始的方法来解决问题,也是一个思路。虽然有时候我很懒,喜欢用开源组件,但有的时候一旦用上原始的了,也不喜欢改了。

    字符串分析处理的过程虽然繁琐,但基本都是比较简单的,细致一点,都不是事。

  最后把这个测试的源代码发上来,大家别忘了点赞哦。。。