您的位置:广东在线游戏网 > 游戏资讯 > json开头要不要写申明?

json开头要不要写申明?

作者:广东在线游戏网日期:

返回目录:游戏资讯


public static void main(String[] args){

e79fa5e98193e4b893e5b19e338String temp="{'data':{'a':[{'b1':'bb1','c1':'cc1'},{'b2':'bb2','c2':'cc2'}]}}";

JSONObject jodata =JSONObject.fromObject(temp);

JSONObject joa =JSONObject.fromObject(jodata.get("data").toString());

JSONArray ja=JSONArray.fromObject(joa.get("a"));

for(int i=0;i<ja.size();i++){

JSONObject o=ja.getJSONObject(i);

if(o.get("b1")!=null){

System.out.println(o.get("b1"));

}

if(o.get("c1")!=null){

System.out.println(o.get("c1"));

}

if(o.get("b2")!=null){

System.out.println(o.get("b2"));

}

if(o.get("c2")!=null){

System.out.println(o.get("c2"));

}

}

}

注:要包含两个jar包ezmorph-1.0.6.jar和json-lib-2.2.2-jdk15.jar,jar包在附件中



一般我zhidao们这样用
var arr=[
{
"name":"张国立",
"sex":"男",
"email":""
},
{
"name":"张铁林",
"sex":"男",
"email":""
},
{
"name":"邓婕",
"sex":"女",
"email":""
}
];


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:['阿甲e799bee5baa6e4b893e5b19e361','阿甲','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();

看看结果如何:

相关阅读

  • json开头要不要写申明?

  • 广东在线游戏网游戏资讯
  • public static void main(String[] args){ e79fa5e98193e4b893e5b19e338String temp="{data:{a:[{b1:bb1,c1:cc1},{b2:bb2,c2:cc2}]}}"; JSONObject jodata =JS
关键词不能为空

标签导航

CF TS警告码问题 高手来帮一帮 TS警告码怎么解决 CF:TS警告码12000451怎么解决? 这个TS警告码怎么解决啊 是... 求翻译 低头不是认输 是要看见自... 低头不是认输 低头不是认输,是要看清自己的路;仰头不是骄傲,是要看见自己的... 低头不是认输,是要看清自己走的路,仰头不是骄傲,是看见自己的... 是要看清自己的路仰头不是骄傲 怎样用java解析一个json字符串 java解析json数据成数组 json开头要不要写申明? json的属性是对象,怎么用java解析该json字符串获得... 街头霸王4存档怎么用 街头霸王4自己存的挡 无法读取... 街头霸王4的存档在哪个文件 PC单机游戏街头霸王4怎么存档和读取存档? 求魔兽争霸3冰封王座四方阵&#47;四方战争 防守版地图下载越多越好 谁有魔兽地图四方战争特色版1.6正式版下载地址 魔兽争霸3冰封王座四方阵地图的下载地址 街头霸王剧场版有几部啊?? 街头霸王2剧场版 56分钟那首日文歌曲叫什么名字? 街头霸王一共几个剧场版 请问谁有《街霸2剧场版》的bt下载或者可以ie下载的网站呢?... 街霸2古列的波和光腿,所有的招式说明都说要蓄气3秒,可是看高... 街霸和拳皇里的人物都在喊些什么?哪位大神给翻译下? 街霸人物出大招时喊的是啥? 求“街霸”中人物发招时的叫喊声 dnftp点在哪学技能 DNF的tp技能是什么 dnf中TP技能点是什么,怎么才有?? dnf最新版本 tp技能在哪学??? gba洛克人系列全部名单 洛克人系列好玩排行前十要简介理由 求所有洛克人作品的列表 按年代排列 gba格式的洛克人有几部分别叫什么名 如何看待《街霸2》在中国格斗游戏界的地位 春丽在街霸里战斗力这么弱吗 街霸2春丽问题 街霸2 谁是中国最强的春丽 难道就是她 教父2 ,能不能用中文玩? 教父2修改器怎么用? 教父2繁体中文修改器怎么安装 速度!~!~ 教父2修改器怎么用 为什么腾讯游戏无法运行,一直出现什么Ts警告码..重新启动计... 刚在网吧玩游戏,登录穿越火线的时候显示 ts 警告码 游戏初... LOL打开就提示游戏初始化失败,请参考腾讯游戏安全中心官网!... 74)怎么解决 22 TX游戏登入时出现TS警告码(1 求街头霸王4中文版的下载地址··要迅雷下载的·不要有木马的·... 终极街霸4中文免安装下载