餐条体育网

您现在的位置是: 首页 > 赛事报道

文章内容

哥伦甲比分-哥伦甲是什么联赛

tamoadmin 2024-10-23
用原始方法解析复杂字符串,json一定要用JsonMapper么1.不规则非json字符串先看看这个例子,字符串是连在一起,没有换行的,为了方便观察,换行了,程

用原始方法解析复杂字符串,json一定要用JsonMapper么

哥伦甲比分-哥伦甲是什么联赛

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();

看看结果如何: