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文件的更多相关文章

  1. jquery无法读取json文件问题

    jquery无法读取json文件,如:user.json文件无法读取.把user.json文件的后缀名修改为aspx,文件内容不变,则可以读取~ 原理不懂!~~

  2. Unity 用C#脚本读取JSON文件数据

    读取JSON文件数据网上有很多方法吗,这里采用SimpleJSON,关于SimpleJSON的介绍参考以下链接:http://wiki.unity3d.com/index.php/SimpleJSON ...

  3. cocos2d-x 读取 json 文件并用 jsoncpp 做解析

    一码胜万言(请看注释) CclUtil.h // // CclUtil.h // PracticeDemo // // Created by kodeyang on 8/1/13. // // #if ...

  4. jQuery读取json文件,实现省市区/县(国标)三级联动

    最近做一个微信项目,需要用户填写所在的省市区/县,决定使用jQuery读取json文件来实现省市区/县的联动. 其实很简单,jQuery文档也有详细解释: 代码如下: html <table w ...

  5. jqery ajax读取json文件

    json文件数据 [ {"name":"哈哈··","email":"邮箱01","gender": ...

  6. spring注解读取json文件

    开发时候在接口没有提供的时候,可以用json文件提前模拟接口数据 1.service层 package com.syp.spring.service; import java.io.File; imp ...

  7. Android - 读取JSON文件数据

    Android读取JSON文件数据 JSON - JavaScript Object Notation 是一种存储和交换文本信息的语法. JSON对象在花括号中书写.用逗号来分隔值. JSON数组在方 ...

  8. Asp.Net MVC 读取json文件

    有些系统上面的配置可以做成config里面的appsetting.这里要求写在json文件里面. 首先 添加命名空间 using Newtonsoft.Json; using System.IO; u ...

  9. Python json 读取 json 文件并转为 dict

    Python json 读取 json 文件并转为 dict 在 D 盘 新建 test.json: { "test": "测试\n换行", "dic ...

  10. nodejs读取json文件,写入mongodb数据库

    最近又一点时间,开始使用mongodb存储json模型文件,然后可以实现模型文件的在线编辑和管理.今天上午实现了json文件入库的代码,如下: var fs=require("fs" ...

随机推荐

  1. 【BZOJ】【4145】【AMPPZ2014】The Prices

    状压DP/01背包 Orz Gromah 容易发现m的范围很小……只有16,那么就可以状压,用一个二进制数来表示买了的物品的集合. 一种简单直接的想法是:令$f[i][j]$表示前$i$个商店买了状态 ...

  2. 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 ...

  3. SiteMapPath基本用法

    1.添加一个网站地图项 Web.sitemap项 2.在 Web.sitemap项的写法如下: <?xml version="1.0" encoding="utf- ...

  4. Improve your code with lint checks

    官方文档 使用 Lint 改进您的代码 [Improve your code with lint checks] 除了[In addition to]测试 Android 应用以确保其符合功能要求[m ...

  5. jQuery操作Frame(iFrame)

    没找到很好的方法只好用DOM方法与jquery方法结合的方式实现了 1.在父窗口中操作 选中IFRAME中的所有单选钮$(window.frames["iframe1"].docu ...

  6. 【Eclipse】Eclipse性能调优

    Eclipse性能调优 eclipse 吃内存_百度搜索 eclipse 性能调优之内存分配 - Defonds 的专栏 - CSDN博客 优化JVM参数提高eclipse运行速度 - Java综合 ...

  7. word2013怎样批量重设图片和大小?(转)

    https://www.zhihu.com/question/52908434/answer/132934213 点击视图,宏,查看宏,任意输入一个宏名,创建,清空框内内容,复制以下代码粘贴,保存. ...

  8. IIS配置中出现HRESULT:0X80070020错误

    Win7 IIS启动失败.手工启动它,提示:“另一个程序正在使用此文件,进程无法访问!” 此时是因为另一个程序占用了IIS的端口号,IIS一般用的是80端口,是谁占用了这个端口呢? 方法如下:开始菜单 ...

  9. Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC

    在之前的<跟我学SpringMVC>中的<第七章 注解式控制器的数据验证.类型转换及格式化>中已经介绍过SpringMVC集成Bean Validation 1.0(JSR-3 ...

  10. C#.NET常见问题(FAQ)-如何让文本框textbox内容靠右显示

    对于TextBox,我可以设置Text-Align属性为right,就可以让文字靠右了   对于Label而言,需要修改AutoSize为False,并修改TextAlign为MiddleRight, ...