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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • chegg网站_chunked

    chegg网站_chunked服务端给浏览器发送报文时,必须告诉浏览器报文的大小,这样浏览器可以根据报文大小来判断报文的完整性以及在长连接中确定报文的截尾。但是很多服务器的报文是动态创建的,在发送之前是无法确定其大小的。服务器只有等待内容全部创建后,计算出主体的大小,才能响应客户端的请求,这样的处理方法大大延迟了响应。传输编码中的分块编码为这种困难提供了解决方案,服务器可以逐块发送主体,并说明每块的大小就可以了。HTTP协议中

    2025年8月1日
    2
  • pytest parametrize fixture_参数化数据

    pytest parametrize fixture_参数化数据前言当某个接口中的一个字段,里面规定的范围为1-5,你5个数字都要单独写一条测试用例,就太麻烦了,这个时候可以使用pytest.mark.parametrize装饰器可以实现测试用例参数化。官方示

    2022年7月30日
    10
  • Mac(OSX)下媲美XShell的神器Termius「建议收藏」

    Mac(OSX)下媲美XShell的神器Termius「建议收藏」文章目录简介特点软件环境配置配置项配置密钥配置说明配置主机配置项简介XShell的大名不用多说,称它为Windows平台最好用的远程终端不为过吧。唯一不足的地方就是它只有Windows版本。所以今天跟大家介绍一款全平台的远程终端——Termius。Termius不仅涵盖了Windows、Linux、OSX,还变态得支持Android和iOS(以后在地铁、公交上都可以随时拿出手机来排查线上问题啦…………

    2022年7月20日
    22
  • Python 发送 email 的三种方式

    Python 发送 email 的三种方式Python发送email的三种方式,分别为使用登录邮件服务器、使用smtp服务、调用sendmail命令来发送三种方法原文请参见米扑博客:Python发送email的三种方式Python发送email比较简单,可以通过登录邮件服务来发送,linux下也可以使用调用sendmail命令来发送,还可以使用本地或者是远程的smtp服务来发送邮件,不管是单个,群发,还是抄送都比较容易实现。…

    2022年7月11日
    25
  • hdu 3652 B-number(数字dp)

    hdu 3652 B-number(数字dp)

    2022年1月4日
    39
  • Centos7安装Mysql5.7最全教程[通俗易懂]

    Centos7安装Mysql5.7最全教程[通俗易懂]最近需要在Linux系统上使用MySQL,记录一下安装过程吧,为后来的同学排除一些问题。更新yumyumupdate-y1.安装wget工具我安装到了/export/install这里可以进入你们所想要安装的地方cd/先进入你想安装的位置,此后全部在此文件夹进行操作。sudoyuminstall-ywget2.使用wget下载mysqlyum源:wgethttps://dev.mysql.com/get/mysql80-community-release-el

    2022年5月2日
    87

发表回复

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

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