java校验json格式_json格式校验

java校验json格式_json格式校验C语言json格式校验最近用到json格式数据传输信息,在C语言中使用cjson解析json字符串,若json格式不正确,会使整个进程直接挂掉。想到能否在解析前先进行格式校验,通过后再解析,查找资料,网上有现成源码,网址:http://www.json.org/JSON_checker/主要用到两个文件JSON_checker.c和JSON_checker.h,具体用法可以参考main.c。这里参考了博客:C语言如何检测json格式的数据合法性中的用法,并加以改进。在官网中提供了json检查的测试文

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

C语言json格式校验

最近用到json格式数据传输信息,在C语言中使用cjson解析json字符串,若json格式不正确,会使整个进程直接挂掉。想到能否在解析前先进行格式校验,通过后再解析,查找资料,网上有现成源码,网址:http://www.json.org/JSON_checker/在这里插入图片描述
主要用到两个文件JSON_checker.c和JSON_checker.h,具体用法可以参考main.c。这里参考了博客:C语言如何检测json格式的数据合法性 中的用法,并加以改进。

在官网中提供了json检查的测试文件,但没有包含中文的,这里添加了一个中文测试文件,如下:

{ 
   
	"JSON 测试 pass4": { 
   
		"Chinese": "中文测试.",
		"这是pass4测试": "中文中文."
	}
}

Jetbrains全家桶1年46,售后保障稳定

main.c

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "JSON_checker.h"
/* 批量读取test下文件并检查json格式 */
int main()
{ 

int nRtn = 0;
FILE *fp;
int i;
int nStrLen;
char abyFile[16] = { 
0};
char *json_src_string = NULL;
char *json_chk_string = NULL;
//错误文件检查
for (i = 1; i < 34 ; i++)
{ 

sprintf(abyFile, "test/fail%d.json", i);
if ((fp = fopen(abyFile, "rb")) == NULL)
{ 

printf("open %s failed\n", abyFile);
continue;
}
fseek(fp, 0, SEEK_END);
nStrLen = ftell(fp) + 1;
json_src_string = (char *) malloc(sizeof(char) * nStrLen);
memset(json_src_string, 0, sizeof(char) * nStrLen);
json_chk_string = (char *) malloc(sizeof(char) * nStrLen);
memset(json_chk_string, 0, sizeof(char) * nStrLen);
fseek(fp, 0, SEEK_SET);
fread(json_src_string, nStrLen, sizeof(char), fp);
fclose(fp);
//替换中文字符为“*”
replace_character(json_src_string, json_chk_string);
nRtn = json_checker(json_chk_string);
if (0 == nRtn)
{ 

printf(" %s pass check\n", abyFile);
//解析json_src_string
//to do
}
else
{ 

printf(" %s fail check\n", abyFile);
}
free(json_src_string);
json_src_string = NULL;
free(json_chk_string);
json_chk_string = NULL;
memset(abyFile, 0, sizeof(abyFile));
}
//正确文件检查
for (i = 1; i < 6 ; i++)
{ 

sprintf(abyFile, "test/pass%d.json", i);
if ((fp = fopen(abyFile, "rb")) == NULL)
{ 

printf("open %s failed\n", abyFile);
continue;
}
fseek(fp, 0, SEEK_END);
nStrLen = ftell(fp) + 1;
json_src_string = (char *) malloc(sizeof(char) * nStrLen);
memset(json_src_string, 0, sizeof(char) * nStrLen);
json_chk_string = (char *) malloc(sizeof(char) * nStrLen);
memset(json_chk_string, 0, sizeof(char) * nStrLen);
fseek(fp, 0, SEEK_SET);
fread(json_src_string, nStrLen, sizeof(char), fp);
fclose(fp);
//替换中文字符为“*”
replace_character(json_src_string, json_chk_string);
nRtn = json_checker(json_chk_string);
if (0 == nRtn)
{ 

printf(" %s pass check\n", abyFile);
//解析json_src_string
//to do
}
else
{ 

printf(" %s fail check\n", abyFile);
}
free(json_src_string);
json_src_string = NULL;
free(json_chk_string);
json_chk_string = NULL;
memset(abyFile, 0, sizeof(abyFile));
}
return 0;
}

main.c中的json_checker函数如下,格式正确返回0,否则返回-1:

int json_checker(const char *json_str) 
{ 

JSON_checker jc = new_JSON_checker(20);
int len = strlen(json_str);
int tmp_i = 0;
for (tmp_i = 0; tmp_i < len; tmp_i++) 
{ 

int next_char = json_str[tmp_i];
if (next_char <= 0) 
{ 

break;
}
if (0 == JSON_checker_char(jc, next_char)) 
{ 

fprintf(stderr, "JSON_checker_char: syntax error\n");
return -1;
}
}
if (0 == JSON_checker_done(jc)) 
{ 

fprintf(stderr, "JSON_checker_end: syntax error\n");
return -1;
}
return 0;
}

main.c中的replace_character函数如下:

/* 将中文字符替换为'*' 用于json字符串合法性检查 instr: 原字符串(用来解析) outstr: 替换后字符串(用来检查) */
int replace_character(char *instr, char* outstr)
{ 

if (instr == NULL)
{ 

printf("No string buf...\n");
return -1;
}
while(*instr != '\0')
{ 

//acsll范围00-7F
if (((*instr) < 0x00) || ((*instr) > 0x7F))
{ 

*outstr++ = '*';
instr++;
}
else
{ 

*outstr++ = *instr++;
}
}
return 0;
}

因为这里会把输入中包含中文的字符串按字节替换为 “*”,因此解析时候还得用原字符串。如果确认json字符串中不含有中文,则不需要调用replace_character,直接调用json_checker(json_src_string)即可。

将以上两个文件和main.c通过Makefile一起编译,遍历test中的测试文件,测试结果如下:

JSON_checker_char: syntax error
test/fail1.json fail check
.
.
.
JSON_checker_end: syntax error
test/fail32.json fail check
JSON_checker_char: syntax error
test/fail33.json fail check
test/pass1.json pass check
test/pass2.json pass check
test/pass3.json pass check
test/pass4.json pass check
test/pass5.json pass check

以上源码包括test文件打包下载:c语言json格式校验代码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/207456.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • javascript 字符串包含判断_js去除字符串前后的空格

    javascript 字符串包含判断_js去除字符串前后的空格本文教程操作环境:windows7系统、jquery3.2.1版本,DELLG3电脑。小编介绍过js中使用indexOf()方法判断字符串包含某个字符(https://www.py.cn/web/js/22856.html),是一个很好用的方法,但除了这个方法之外,JavaScript中还有四种方法可以实现判断字符串包含某个字符:1、使用字符串search()方法search()方法用于检…

  • luke的使用[通俗易懂]

    luke的使用[通俗易懂]zz网络首次用Luke打开索引文件。Overview里面显示了索引具有的Field数目(以最大的Field为准吧?),还有就是文档的总数和Term即索引词的总数?有时一个关键词,对应于多个文档,所

  • .npy文件_文件后缀名是npy怎么打开

    .npy文件_文件后缀名是npy怎么打开深度学习–迁移学习在使用训练好的模型时,其中有一种保存的模型文件格式叫.npy。打开方式·实现代码:importnumpyasnptest=np.load(‘./bvlc_alexnet.npy’,encoding=”latin1″)#加载文件doc=open(‘1.txt’,’a’)#打开一个存储文件,并依次写入print(test,file=doc)#…

    2022年10月22日
  • 如何在win10上安装ubuntu虚拟机-图文详细教程「建议收藏」

    前言(和我一样的小白快来看看~)本文将在win10上安装ubuntu虚拟机的步骤一步步记录了下来~希望对大家有帮助方法大概是先装一个虚拟化软件(virtualbox),然后在这个软件上新增一台虚拟电脑机,这样我们就等于有了一台没有装系统的电脑。然后再将我们已经下载好的iso结尾的镜像文件(ubuntu)作为启动盘,给这个虚拟电脑装上系统,就完事了~安装包和镜像文件准备virtu…

  • 从头开始学MySQL——-存储过程与存储函数(1)

    从头开始学MySQL——-存储过程与存储函数(1)10.1.1创建存储过程存储过程就是一条或者多条SQL语句的集合,可以视为批文件。它可以定义批量插入的语句,也可以定义一个接收不同条件的SQL。创建存储过程的语句为CREATEPROCEDURE,创建存储函数的语句为CREATEFUNCTION。调用存储过程的语句为CALL。调用存储函数的形式就像调用MyS……

  • dart jsonDecode与jsonEncode[通俗易懂]

    dart jsonDecode与jsonEncode[通俗易懂]jsDecode顾名思义是解析json,解析json到模型中,例如将字符串jsonpt解析到实体类payloadModel中:finalpayloadModel=PayLoadModel.fromJson(jsonDecode(pt)asMap<String,dynamic>);jsonEncode是把数据转为json

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号