用C读取json文件
a
jconf_t *
read_jconf(const char *file)
{
static jconf_t conf;
// 清空数据
memset(&conf, , sizeof(jconf_t));
// 用于存储文件内容的字符串指针
char *buf;
// 解析文件内容后的json结构化数据
json_value *obj;
// 打开文件
FILE *f = fopen(file, "rb");
if (f == NULL) {
FATAL("Invalid config path.");
}
// 确定文件大小, 并将读取指针移回文件开始
fseek(f, , SEEK_END);
long pos = ftell(f);
fseek(f, , SEEK_SET);
if (pos < ) {
FATAL("Invalid config path.");
}
if (pos >= MAX_CONF_SIZE) {
FATAL("Too large config file.");
}
// 根据文件大小申请内存空间, 注意这边要多申请1个字节用于存放'\0'
buf = ss_malloc(pos + );
if (buf == NULL) {
FATAL("No enough memory.");
}
// 读取文件内容至buff
int nread = fread(buf, pos, , f);
if (!nread) {
FATAL("Failed to read the config file.");
}
// 关闭文件
fclose(f);
// 关闭字符串结尾
buf[pos] = '\0'; // end of string json_settings settings = { 0UL, , NULL, NULL, NULL };
char error_buf[];
// 解析内容至结构化json数据
obj = json_parse_ex(&settings, buf, pos, error_buf);
if (obj == NULL) {
FATAL(error_buf);
}
if (obj->type == json_object) {
unsigned int i, j;
// 遍历json数据
for (i = ; i < obj->u.object.length; i++) {
// 每一步, 都先读取键名, 然后根据value类型, 读取value内容
char *name = obj->u.object.values[i].name;
json_value *value = obj->u.object.values[i].value;
if (strcmp(name, "server") == ) {
if (value->type == json_array) {
for (j = ; j < value->u.array.length; j++) {
if (j >= MAX_REMOTE_NUM) {
break;
}
json_value *v = value->u.array.values[j];
char *addr_str = to_string(v);
parse_addr(addr_str, conf.remote_addr + j);
ss_free(addr_str);
conf.remote_num = j + ;
}
} else if (value->type == json_string) {
conf.remote_addr[].host = to_string(value);
conf.remote_addr[].port = NULL;
conf.remote_num = ;
}
} else if (strcmp(name, "port_password") == ) {
if (value->type == json_object) {
for (j = ; j < value->u.object.length; j++) {
if (j >= MAX_PORT_NUM) {
break;
}
json_value *v = value->u.object.values[j].value;
if (v->type == json_string) {
conf.port_password[j].port = ss_strndup(value->u.object.values[j].name,
value->u.object.values[j].name_length);
conf.port_password[j].password = to_string(v);
conf.port_password_num = j + ;
}
}
}
} else if (strcmp(name, "server_port") == ) {
conf.remote_port = to_string(value);
}
// ...
}
} else {
FATAL("Invalid config file");
}
// 释放文件内容内存空间
do {
free(buf);
buf = NULL;
} while ();
// 释放结构化json数据空间
json_value_free(obj);
return &conf;
} void *
ss_malloc(size_t size) {
void *tmp = malloc(size);
if (tmp == NULL)
exit(EXIT_FAILURE);
return tmp;
}
.
用C读取json文件的更多相关文章
- jquery无法读取json文件问题
jquery无法读取json文件,如:user.json文件无法读取.把user.json文件的后缀名修改为aspx,文件内容不变,则可以读取~ 原理不懂!~~
- Unity 用C#脚本读取JSON文件数据
读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON ...
- cocos2d-x 读取 json 文件并用 jsoncpp 做解析
一码胜万言(请看注释) CclUtil.h // // CclUtil.h // PracticeDemo // // Created by kodeyang on 8/1/13. // // #if ...
- jQuery读取json文件,实现省市区/县(国标)三级联动
最近做一个微信项目,需要用户填写所在的省市区/县,决定使用jQuery读取json文件来实现省市区/县的联动. 其实很简单,jQuery文档也有详细解释: 代码如下: html <table w ...
- jqery ajax读取json文件
json文件数据 [ {"name":"哈哈··","email":"邮箱01","gender": ...
- spring注解读取json文件
开发时候在接口没有提供的时候,可以用json文件提前模拟接口数据 1.service层 package com.syp.spring.service; import java.io.File; imp ...
- Android - 读取JSON文件数据
Android读取JSON文件数据 JSON - JavaScript Object Notation 是一种存储和交换文本信息的语法. JSON对象在花括号中书写.用逗号来分隔值. JSON数组在方 ...
- Asp.Net MVC 读取json文件
有些系统上面的配置可以做成config里面的appsetting.这里要求写在json文件里面. 首先 添加命名空间 using Newtonsoft.Json; using System.IO; u ...
- Python json 读取 json 文件并转为 dict
Python json 读取 json 文件并转为 dict 在 D 盘 新建 test.json: { "test": "测试\n换行", "dic ...
- nodejs读取json文件,写入mongodb数据库
最近又一点时间,开始使用mongodb存储json模型文件,然后可以实现模型文件的在线编辑和管理.今天上午实现了json文件入库的代码,如下: var fs=require("fs" ...
随机推荐
- 【BZOJ】【4145】【AMPPZ2014】The Prices
状压DP/01背包 Orz Gromah 容易发现m的范围很小……只有16,那么就可以状压,用一个二进制数来表示买了的物品的集合. 一种简单直接的想法是:令$f[i][j]$表示前$i$个商店买了状态 ...
- Useful JVM Flags – Part 8 (GC Logging)
The last part of this series is about garbage collection logging and associated flags. The GC log is ...
- SiteMapPath基本用法
1.添加一个网站地图项 Web.sitemap项 2.在 Web.sitemap项的写法如下: <?xml version="1.0" encoding="utf- ...
- Improve your code with lint checks
官方文档 使用 Lint 改进您的代码 [Improve your code with lint checks] 除了[In addition to]测试 Android 应用以确保其符合功能要求[m ...
- jQuery操作Frame(iFrame)
没找到很好的方法只好用DOM方法与jquery方法结合的方式实现了 1.在父窗口中操作 选中IFRAME中的所有单选钮$(window.frames["iframe1"].docu ...
- 【Eclipse】Eclipse性能调优
Eclipse性能调优 eclipse 吃内存_百度搜索 eclipse 性能调优之内存分配 - Defonds 的专栏 - CSDN博客 优化JVM参数提高eclipse运行速度 - Java综合 ...
- word2013怎样批量重设图片和大小?(转)
https://www.zhihu.com/question/52908434/answer/132934213 点击视图,宏,查看宏,任意输入一个宏名,创建,清空框内内容,复制以下代码粘贴,保存. ...
- IIS配置中出现HRESULT:0X80070020错误
Win7 IIS启动失败.手工启动它,提示:“另一个程序正在使用此文件,进程无法访问!” 此时是因为另一个程序占用了IIS的端口号,IIS一般用的是80端口,是谁占用了这个端口呢? 方法如下:开始菜单 ...
- Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
在之前的<跟我学SpringMVC>中的<第七章 注解式控制器的数据验证.类型转换及格式化>中已经介绍过SpringMVC集成Bean Validation 1.0(JSR-3 ...
- C#.NET常见问题(FAQ)-如何让文本框textbox内容靠右显示
对于TextBox,我可以设置Text-Align属性为right,就可以让文字靠右了 对于Label而言,需要修改AutoSize为False,并修改TextAlign为MiddleRight, ...