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


相关推荐

  • acwing-1088旅行问题

    acwing-1088旅行问题原题链接John 打算驾驶一辆汽车周游一个环形公路。公路上总共有 n 个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。任务:判断以每个车站为起点能否按条件成功周游一周。输入格式第一行是一个整数 n,表示环形公路上的车站数;接下来 n 行,每行两个整数

    2022年8月9日
    2
  • bootcamp您的磁盘未能分区_bootcamp无法调整分区大小

    bootcamp您的磁盘未能分区_bootcamp无法调整分区大小朋友把macbookpro拿来让我帮删除下用bootcamp安装的win10系统,于是就打开mac进入实用工具->磁盘工具->点击左侧磁盘列表中的MacintoshHD根目录,右侧选择分区,然后点击右侧分区布局列表中的BOOTCAMP,点下面的『-』号,再点移除,系统提示『您的磁盘不能恢复为单一的分区』。    遇到问题找度娘,结果查询出来的结果是,需要重新安装MAC系统,『NT

    2022年8月11日
    4
  • Matlab中的plotyy用法总结[通俗易懂]

    Matlab中的plotyy用法总结[通俗易懂]在梳理数据,或者写论文的时候往往需要画出两个纵坐标不同的图,以显现两组数据的不同变化,在这种情况下,一般两组数据的横坐标均是相同的,但是纵坐标确实不是一个数量级的,所以为了更好的表现两组数据的变化趋势,需要用到plotyy函数绘制双纵坐标的二维图,具体用法总结如下:调用格式:1.plotyy(X1,Y1,X2,Y2):以左、右不同纵轴绘制X1-Y1、X2-Y2两条曲线。2.plotyy(…

    2022年6月29日
    55
  • html url编码、url解码

    html url编码、url解码

    2022年2月20日
    160
  • Java 中构造器、初始化块、静态初始化块的执行顺序

    Java 中构造器、初始化块、静态初始化块的执行顺序静态初始化块 &gt; 初始化块 &gt; 构造器 父类 &gt; 子类综合下来顺序就是:父类静态初始化块 子类静态初始化块 父类初始化块 父类构造器 子类初始化块 子类构造器需要注意静态初始化块是在类第一次加载的时候就会进行初始化。…

    2022年6月13日
    24
  • Mybatis 拦截器简述[通俗易懂]

    Mybatis 拦截器简述[通俗易懂]一、Mybatis拦截器可以做到什么慢查询,SQL异常监控数据预处理(加密,自生成字段)数据脱敏数据权限过滤二、MybatisSQL执行流程这里重点关注InterceptorChain,它会为Mybatis的四大对象织入代理。我们自定义生成的拦截器也将通过InterceptorChain织入。三、Mybatis拦截器使用方式拦截粒度为方法签名自定义拦截器需使用@Intercepts和@Signature注解来指定拦截类和方法。例如拦截Exceptor的query和update

    2022年9月8日
    0

发表回复

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

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