2014年7月14日星期一

如何识别一个字符串是否Json格式

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
如何识别一个字符串是否Json格式  阅读原文»

如何识别一个字符串是否Json格式

距离上一篇文章,又过去一个多月了,近些时间,工作依旧很忙碌,除了管理方面的事,代码方面主要折腾三个事:

1:开发框架(一整套基于配置型的开发体系框架)

2:CYQ.Data 数据层框架(持续的更新,最近也加入了Sybase的支持)

3:工作流流程图设计器。

由于这三个方面都涉及到Json,所以就谈谈这些天在Json上花下的心思。

很多人对于造轮子都会有自己的看法,这里提一下个人的观点:

个人认为:

1:首要是要具备造轮子的能力,然后再讨论造不造与浪不浪、轮子与时间的问题。

2:造轮子的、写文章的,永远比使用轮子的、看文章的,多经历了一些、多思考一些、多知道一些。

所以,别嫌造轮子折腾,虽然的确很折腾,不是有那么句:生命在于折腾,除了瞎折腾。

PS:本来文章是写Json常用的功能交互那块相关的知识,所以才有这一段。

不多扯了,扯多了都是蛋,还是回归正题吧。

如何识别一个字符串是不是Json。

网上搜了一下,找到两三个坑人的答案:

A:Js识别,Eval一下,成功就是,失败就挂。

B:C#识别,判断开始和结束符号:{}或[]

C:用正则表达式判断。

上面ABC答案都纯忽悠,只要认真一下,都不靠谱了。

经过我的研究,发现这是有很有挑战性的课题:

Json需要分析的情况,比想象的要多,举一个不太简单的Json:

[1,{"a":2},\r\n{"a":{}}, {"a":[]},{"a":[{}]},{"{[a":"\"2,:3,"a":33}]"}]

从上面这个Json中,就可以看出需要分析的有:

1:数组和Json数组。

2:键与值(无引号、双引号)的识别

3:无限级值嵌套(数组嵌套、Json嵌套)

4:7个关键符号[{,:"}]。

5:转义符号、空格、换行、回车处理。

回顾早些年写的JsonHelper

还记得CYQ.Data里JsonHelper的最初版本,仅处理了只有一级Json的简单情况,那时候分析Json就靠以下两种方法:

1:Split 分隔。

2:循环 indexOf 识别。

虽然偷工减料,投机取巧,但只要限定使用环境和条件、好在够用,也够简单。

当然了,现在情况变了,把限定的环境和条件去除后,事实上,要分析起来就没那么简单了。

故事一开始,思考了三天三夜

由于放开了条件,需要考虑无限级递归的,于是看似Split和IndexOf这种方式已经不奏效了。

字符串的分析方法看似需要改朝换代了,但我仍给Split和IndexOf寻求最后的机会。

经过层层思考与分析,发经没折了,只有祭出终极必杀招了。

终极大招:遍历字符,记录状态

一个万能的解决方法,就是遍历每个字符,然后记录这个字符前后左右上下东南西北中发白各种状态,再根据状态来识别下一个字符的动作。

1:首先有一个记录字符状态的类,如下图:

这个字符状态的记录类,我前后不断调整了N天,才终于感觉好像OK了。

2:接下来是字符的状态设置,根据不同的关键字,设置状态,如下图:

这是个漫长不断调试的过程,很折腾人。

3:一个可以不断递归Json的函数,如下图:

4:一个可以识别语法错误的函数:

5:最后是一个给外部的调用方法:

虽然本文是关于识别Json格式,实际上,它已经是Json解析类的核心,用它可以演化出Json的各种应用,有机会再介绍了。

事实上, 一开始是原打算写Json与Xml互转那一块的,写文的意原来自最近一周折腾工作流的流程设计器那一块:

从Xml出来到前端成为Json,编辑完后回去又要转回原始格式的Xml存档,所以在Xml和Json间,必须有一套协议,这些,大概是时间不够,所以临时变了一个题目。

关于Json的在线解析,以及Json和Xml和互转,临时我开了个域名 :tool.cyqdata.com,仅方便自己使用。

夜已深,该闭眼去梦里的世界旅游了。

最后是本文的源码:

ExpandedBlockStart.gif

1usingSystem;
2usingSystem.Collections.Generic;
3usingSystem.Text;
4
5namespaceCYQ.Data.Tool
6{
7///<summary>8///分隔Json字符串为字典集合。
9///</summary>10internalclassJsonSplit
11{
12privatestaticboolIsJsonStart(refstringjson)
13{
14if(!string.IsNullOrEmpty(json))
15{
16json=json.Trim('\r','\n','');
17if(json.Length>1)
18{
19chars=json[0];
20chare=json[json.Length-1];
21return(s=='{'&&e=='}')||(s=='['&&e==']');
22}
23}
24returnfalse;
25}
26internalstaticboolIsJson(stringjson)
27{
28interrIndex;
29returnIsJson(json,outerrIndex);
30}
31internalstaticboolIsJson(stringjson,outinterrIndex)
32{
33errIndex=0;
34if(IsJsonStart(refjson))
35{
36CharStatecs=newCharState();
37charc;
38for(inti=0;i<json.Length;i++)
39{
40c=json;
41if(SetCharState(c,refcs)&&cs.childrenStart)//设置关键符号状态。42{
43stringitem=json.Substring(i);
44interr;
45intlength=GetValueLength(item,trueCentOS7 编译安装LNMP  阅读原文»

LNMP(Linux-Nginx-Mysql-PHP),本文在CentOS7.0上编译LNMP尝尝鲜,全文基本上都是采用手动编译部署...依赖yum帮我安装了GCC和automake..写这个东西耗时有点久了...尼玛 太花时间啦,Linux运维交流群:344177552

主要软件版本:

  nginx-1.6.0  php-5.3.5  mysql-5.5.6  

yum源配置(其实没什么改动)

  [root@ipython ~]# cat /etc/yum.repos.d/1.repo  [1]  name=1  baseurl=file:///media  enabled=1  gpgcheck=0  [root@ipython ~]# mount /dev/cdrom /media && yum clean all  mount: /dev/sr0 is write-protected, mounting read-only  Loaded plugins: fastestmirror  Cleaning repos: 1  Cleaning up everything  

编译工具安装

  [root@ipython ~]# yum install gcc-c++ automake autoconf bzip2  

zlib库(提供数据压缩用的函式库):

  [root@ipython lnmp]# tar zxf zlib-1.2.8.tar.gz  [root@ipython lnmp]# cd zlib-1.2.8  [root@ipython zlib-1.2.8]# ./configure --prefix=/software/sharelib  [root@ipython zlib-1.2.8]# make && make install  

pcre库(rewrite的支持)

  [root@ipython lnmp]# tar zxf pcre-8.35.tar.gz  [root@ipython lnmp]# cd pcre-8.35  [root@ipython pcre-8.35]# ./configure --prefix=/software/pcre --enable-utf8 --enable-unicode-properties  [root@ipython pcre-8.35]# make && make install  

OpenSSL库(https的支持)

  [root@ipython lnmp]# tar zxf openssl-1.0.1h.tar.gz  [root@ipython lnmp]# cd openssl-1.0.1h  [root@ipython openssl-1.0.1h]# ./config --prefix=/software/openssl  [root@ipython openssl-1.0.1h]# make && make install  

TCMalloc工具(google内存管理套件)

  [root@ipython lnmp]# tar zxf libunwind-1.1.tar.gz  [root@ipython lnmp]# cd libunwind-1.1  [root@ipython libunwind-1.1]# CFLAGS=-fPIC ./configure --prefix=/software/google-libunwind  [root@ipython libunwind-1.1]# make CFLAGS=-fPIC && make CFLAGS=-fPIC install  [root@ipython lnmp]# tar zxf gperftools-2.2.tar.gz  [root@ipython lnmp]# cd gperftools-2.2  [root@ipython gperftools-2.2]# LDFLAGS="-L/software/google-libunwind/lib" CPPFLAGS="-I/software/google-libunwind/include" ./configure --prefix=/software/google-perftools  [root@ipython gperftools-2.2]# make && make install  ###路径加到动态链接库###  [root@ipython gperftools-2.2]# echo "/software/google-libunwind/lib/" >> /etc/ld.so.conf  [root@ipython gperftools-2.2]# echo "/software/google-perftools/lib/" >> /etc/ld.so.conf  [root@ipython gperftools-2.2]# echo "/software/sharelib/lib/" >> /etc/ld.so.conf && ldconfig  

Nginx(不解释)

  [root@ipython lnmp]# groupadd -g 1500 nginx  [root@ipython lnmp]# useradd -M -u 1500 -g nginx -s /sbin/nologin nginx  [root@ipython lnmp]# mkdir /var/tmp/nginx  [root@ipython lnmp]# chown nginx:nginx /var/tmp/nginx/  [root@ipython lnmp]# tar zxf nginx-1.6.0.tar.gz  [root@ipython lnmp]# cd nginx-1.6.0  [root@ipython nginx-1.6.0]# sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/' auto/cc/gcc  [root@ipython nginx-1.6.0]# sed -i "s#/usr/local#/software/google-perftools#" auto/lib/google-perftools/conf  ##配置参数有点长##  [root@ipython nginx-1.6.0]# ./configure --prefix=/software/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_ssl_module --with-http_realip_module --with-http_gzip_static_module --with-debug --http-client-body-temp-path=/var/tmp/nginx/client --http-proxy-temp-path=/var/tmp/nginx/proxy --http-fastcgi-temp-path=/var/tmp/nginx/fastcgi --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi --http-scgi-temp-path=/var/tmp/nginx/scgi --with-pcre=/root/lnmp/pcre-8.35 --with-openssl=/root/lnmp/openssl-1.0.1h --with-zlib=/root/lnmp/zlib-1.2.8 --with-google_perftools_module  [root@ipython nginx-1.6.0]# make && make install  [root@ipython nginx-1.6.0]# mkdir /tmp/tcmalloc  [root@ipython nginx-1.6.0]# chmod 0777 /tmp/tcmalloc/  ###这文件在附件里###  [root@ipython nginx-1.6.0]# cp ../nginx.conf /software/nginx/conf/  [root@ipython nginx-1.6.0]# cp ../fcgi.conf /software/nginx/conf/  [root@ipython nginx-1.6.0]# chmod 755 /etc/init.d/nginx  [root@ipython nginx-1.6.0]# mkdir /data/{logs,www.ipython.me}  [root@ipython nginx-1.6.0]# /software/nginx/sbin/nginx  [root@ipython nginx-1.6.0]# iptables -F  [root@ipython nginx-1.6.0]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT  [root@ipython nginx-1.6.0]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT  [root@ipython nginx-1.6.0]# ps aux|grep nginx  root     61291  0.0  0.0  31120   896 ?        Ss   15:36   0:00 nginx: master process /software/nginx/sbin/nginx -c /software/nginx/conf/nginx.conf  nginx    61293  0.0  0.1  31560  1612 ?        S    15:36   0:00 nginx: worker process  

ncurses库(字符终端处理库)

  [root@ipython lnmp]# tar jxf ncurses-5.9.tar.bz2  [root@ipython lnmp]# cd ncurses-5.9  [root@ipython ncurses-5.9]# ./configure --prefix=/software/ncurses --with-shared --without-debug  [root@ipython ncurses-5.9]# make && make install  

Mysql(数据库)

  [root@ipython lnmp]# /usr/sbin/groupadd mysql  [root@ipython lnmp]# /usr/sbin/useradd -s /sbin/nologin -g mysql mysql  [root@ipython lnmp]# tar zxf mysql-5.5.6-rc.tar.gz  [root@ipython lnmp]# cd mysql-5.5.6-rc  [root@ipython mysql-5.5.6-rc]# ./configure --prefix=/software/mysql/ --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-big-tables --with-readline --with-ssl --with-embedded-server --enable-local-infile --with-plugins=partition,innobase,myisammrg --with-named-curses-libs=/software/ncurses/lib/libncurses.so.5  [root@ipython mysql-5.5.6-rc]# make && make install  [root@ipython mysql-5.5.6-rc]# mkdir /data/mysql/{binlog,relaylog} -p  [root@ipython mysql-5.5.6-rc]# chown -R mysql:mysql /data/mysql  [root@ipython mysql-5.5.6-rc]# /software/mysql/bin/mysql_install_db --basedir=/software/mysql/ --datadir=/data/mysql/ --user=mysql  ###这文件在附件里###  [root@ipython mysql-5.5.6-rc]# \cp ../my.cnf /etc/my.cnf  [root@ipython mysql-5.5.6-rc]# \cp ../mysqld /etc/init.d/mysqld  [root@ipython mysql-5.5.6-rc]# chmod 755 /etc/init.d/mysqld  [root@ipython mysql-5.5.6-rc]# systemctl enable mysqld  [root@ipython mysql-5.5.6-rc]# systemctl start mysqld  [root@ipython mysql-5.5.6-rc]# ps aux | grep mysqld  root     55475  0.1  0.1 115348  1696 ?        S    16:07   0:00 /bin/sh /software/mysql/bin/mysqld_safe --datadir=/data/mysql --pid-file=/data/mysql/mysql.pid  mysql    56342  2.7 11.9 1918248 120680 ?      Sl   16:07   0:01 /software/mysql/libexec/mysqld --basedir=/software/mysql --datadir=/data/mysql --plugin-dir=/software/mysql/lib/mysql/plugin --user=mysql --log-error=/data/mysql/mysql_error.log --open-files-limit=10240 --pid-file=/data/mysql/mysql.pid --socket=/tmp/mysql.sock --port=3306  

libiconv库(字符编码转换)

  [root@ipython lnmp]# tar zxf libiconv-1.14.tar.gz  ###打补丁吧,避免手动修改隐患逻辑错误###  [root@ipython lnmp]# gzip -d libiconv-glibc-2.16.patch.gz  [root@ipython lnmp]# cd libiconv-1.14/srclib  [root@ipython srclib]# patch -p1 < ../../libiconv-glibc-2.16.patch  patching file stdio.in.h  [root@ipython libiconv-1.14]# cd ..  [root@ipython libiconv-1.14]# ./configure --prefix=/software/sharelib/  [root@ipython libiconv-1.14]# make && make install  

libxml库(XML库)

  [root@ipython lnmp]# tar jxf libxml2-2.8.0.tar.bz2  [root@ipython lnmp]# cd libxml2-2.8.0  [root@ipython libxml2-2.8.0]# ./configure --prefix=/software/sharelib  [root@ipython libxml2-2.8.0]# make && make install  

libpng库(图片库)

  [root@ipython lnmp]# tar jxf libpng-1.6.8.tar.bz2  [root@ipython lnmp]# cd libpng-1.6.8  [root@ipython libpng-1.6.8]# LDFLAGS="-L/software/sharelib/lib/" CPPFLAGS="-I/software/sharelib/include" ./configure --prefix=/software/sharelib  [root@ipython libpng-1.6.8]# make && make install  

jpeg库(图片库)

  [root@ipython lnmp]# tar jxf jpegsrc.v9a.tar.bz2  [root@ipython lnmp]# cd jpeg-9a/  [root@ipython jpeg-9a]# ./configure --prefix=/software/sharelib/  [root@ipython jpeg-9a]# make && make install  

freetype(字库)

  [root@ipython lnmp]# tar jxf freetype-2.5.2.tar.bz2  [root@ipython lnmp]# cd freetype-2.5.2  [root@ipython freetype-2.5.2]# LIBPNG_CFLAGS="-I/software/sharelib/include/" LIBPNG_LDFLAGS="-L/software/sharelib/lib/" ./configure --prefix=/software/sharelib  [root@ipython freetype-2.5.2]# make && make install  [root@ipython freetype-2.5.2]# ln -s /software/sharelib/include/freetype2 /software/sharelib/include/freetype2/freetype  

libmcrypt库(加密算法)

  [root@ipython lnmp]# tar jxf libmcrypt-2.5.8.tar.bz2  [root@ipython lnmp]# cd libmcrypt-2.5.8  [root@ipython libmcrypt-2.5.8]# ./configure --prefix=/software/sharelib  [root@ipython libmcrypt-2.5.8]# make && make install  

mhash库(加密)

  [root@ipython lnmp]# tar jxf mhash-0.9.9.9.tar.bz2  [root@ipytho

阅读更多内容

没有评论:

发表评论