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


相关推荐

  • 高德地图js api教程_高德地图sdk使用教程

    高德地图js api教程_高德地图sdk使用教程前言:由于项目需求需要在项目中实现手机端(基于网页)考勤打卡功能,最初考虑使用H5自身定位功能,但尝试过后,效果很不稳定。然后尝试使用百度地图JsAPI,百度家的稳定倒是很稳定,没想到的是定位位置和实际位置居然相差几十公里,一开始是以为自己配置有问题,浪费了我大半天时间去找原因,最后发现他本身提供的API就是偏差很大距离的,他自己家的倒是定位很准,对外开放的API简直惨不忍睹。百度API浏……

    2022年10月10日
    1
  • 校验和(Checksum)「建议收藏」

    校验和(Checksum)「建议收藏」校验和(Checksum)PE的可选映像头(IMAGE_OPTION_HEADER)里面,有一个Checksum字段,是该文件的校验和,一般EXE文件可以使0,但一些重要的和系统DLL及驱动文件必须有

    2022年8月5日
    3
  • Java 并发:volatile 关键字解析「建议收藏」

    Java 并发:volatile 关键字解析「建议收藏」在Java并发编程中,要想使并发程序能够正确地执行必须要保证三条原则:原子性、可见性和有序性。只要有一条原则没有被保证,就有可能导致线程安全性问题。volatile关键字被用来保证可见性,即保证共享变量的内存可见性以解决缓存一致性问题,同时其还会禁止进行指令重排序。volatile关键字主要用于使其他线程及时感知共享变量的修改并保证使用变量最新值,例如,用于修饰状态标记量和Double-Check(双重检查)中。

    2022年7月11日
    16
  • java创建线程池的几种方式_定时任务 java

    java创建线程池的几种方式_定时任务 java有时候有些需求不需要顺序执行,所以我就使用了多线程并行执行。废话不多说,上代码。1.创建线程池packageorg.java.multithreading;importorg.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.

    2022年10月1日
    1
  • 秒懂JSONArray和JSONObject的区别和使用

    秒懂JSONArray和JSONObject的区别和使用一.JSONObject是什么?就是对象json;之前在秒懂json中说过,{}表示对象,所以JSONObject就是:{"name":"tom"}同时,这里的对象Json通过添加数组json可以变成对象数组json:{"name":["tome","kate"]}例如:JSONObjectjsono=newJSONObject();JSONArray jsona=…

    2022年6月7日
    32
  • 关于父进程和子进程的关系(UAC 绕过思路)

    关于父进程和子进程的关系(UAC 绕过思路)

    2022年3月2日
    55

发表回复

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

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