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格式校验代码

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux mysql导入数据库_mysql导出数据库为sql文件

    linux mysql导入数据库_mysql导出数据库为sql文件Linux导出sql文件到mysql数据库1.将sql文件上传到服务器上2.登录linux安装的mysql中mysql-uroot-pEnterpassword:******(密码)3.执行导入命令source/home/bak0902.sql4.查看数据库showdatabases;5.使用数据表useaaa;6.查看该库的表showtables;之后就是正常的sql查询即可!欢迎大神指导,可以留言交流!==============

    2022年9月1日
    4
  • 二进制、八进制、十进制、十六进制关系及转换[通俗易懂]

    二进制、八进制、十进制、十六进制关系及转换[通俗易懂]二进制,八进制,十进制,十六进制之间的关系是什么?浮点数是什么回事?本文内容参考自王达老师的《深入理解计算机网络》一书&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;中国水利水电出版社&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;一、数制解释:1、编程中经常使用的数制分类(“你编程时能使用的数制全部在这里了”):⑴、十进制十进制是我们生活中使用得最频繁的进制了。十进制的基数是10,也就是说,十进制有10个数字符

    2022年10月17日
    3
  • zigbee协议栈 任务、事件与轮询机制

    zigbee协议栈 任务、事件与轮询机制typedefunsignedcharuint8  只占一个字节,即二进制的8位,0b00000000,16进制的两位0x00;typedefunsignedshortuint16只占两个字节,即二进制的16位,0b0000000000000000,16进制的四位0x0000 协议栈中有三个变量至关重要:l tasksCnt保存了任务的总个数uint8ta

    2022年5月27日
    38
  • Objective-C路成魔【18-复制对象】[通俗易懂]

    Objective-C路成魔【18-复制对象】

    2022年1月17日
    41
  • pycharm导入模块出错_regsvr32模块加载失败

    pycharm导入模块出错_regsvr32模块加载失败Pycharm项目中,导入模块出现下列情况时,说明Appium-Python-Client没有安装解决方法:1、WIN键+R,输入CMD回车输入pipinstallAppium-Python-Client2、这个时候打开Pycharm,重新输入fromappiumimportwebdriver,仍旧没有成功。是因为你的项目没有添加这个库,还需要以下步骤搜索出Appium-Python-Client,点击添加回到刚才的页面,可以发现已经添加成功了,这时候点击ok即可模块也导

    2025年8月15日
    2
  • jav_video_ASP 第三方控件

    jav_video_ASP 第三方控件[控件界面][控件介绍]名称:DotNetTextBoxV2.0WebControl免费无限制版类型:ASP.NET2.0增强型TextBox控件作者:小宝.NET2.0主页:http://www.aspxcn.com.cn演示页面:http://www.aspxcn.cn.NET2.0技术讨论QQ群:12462711、15532207功能:1.功能强大的…

    2022年10月7日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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