文档章节

lua cjson数字问题

梦想游戏人
 梦想游戏人
发布于 07/23 16:54
字数 306
阅读 87
收藏 0

在cjson的lua5.3版本中,对于数字 都是按照double来处理的 需要修改一下源代码 来正确处理 integer 还是double

添加类型 T_INT 表示 整数 


static void json_next_number_token(json_parse_t *json, json_token_t *token)
{
	char *endptr;
	//	token->type = T_NUMBER;
	//token->value.number
	double value = fpconv_strtod(json->ptr, &endptr);
	if (json->ptr == endptr)
	{
		token->type = T_NUMBER;
		token->value.number = value;
		json_set_token_error(token, json, "invalid number");
	}
	else
	{
		//scaning the str has dot-operation
		char *start = (char*)json->ptr;
		bool is_int = true;
		while (start != endptr)
		{
			if (*start == '.')
			{
				//this is int
				is_int = false;
				break;
			}
			++start;
		}
		if (is_int)
		{
			token->type = T_INT;
			token->value.integer = (long long)value;
		}
		else
		{
			token->type = T_NUMBER;
			token->value.number = value;
		}
		json->ptr = endptr;     /* Skip the processed number */
	}
	return;
}

修改一下 token 类型处理 (push到lua的数据类型)


/* Handle the "value" context */
static void json_process_value(lua_State *l, json_parse_t *json,
	json_token_t *token)
{
	switch (token->type) {
	case T_STRING:
		lua_pushlstring(l, token->value.string, token->string_len);
		break;;
	case T_NUMBER:
		lua_pushnumber(l, token->value.number);
		break;;
	case T_INT:
		lua_pushinteger(l, token->value.integer);
		break;;
	case T_BOOLEAN:
		lua_pushboolean(l, token->value.boolean);
		break;;
	case T_OBJ_BEGIN:
		json_parse_object_context(l, json);
		break;;
	case T_ARR_BEGIN:
		json_parse_array_context(l, json);
		break;;
	case T_NULL:
		/* In Lua, setting "t[k] = nil" will delete k from the table.
		 * Hence a NULL pointer lightuserdata object is used instead */
		lua_pushlightuserdata(l, NULL);
		break;;
	default:
		json_throw_parse_error(l, json, "value", token);
	}
}

重新编译 即可

© 著作权归作者所有

共有 人打赏支持
下一篇: 编译cjson到dll
梦想游戏人
粉丝 36
博文 433
码字总数 123540
作品 0
成都
私信 提问
Lua CJSON 1.0.4 发布,Lua 的 JSON 处理器

Lua CJSON 1.0.4 发布了,该版本修复了在 locale 下的数字转换问题。 Lua CJSON 为 Lua 语言提供高性能的 JSON 解析器和编码器,其性能比纯 Lua 库要高 10 到 20 倍。Lua CJSON 完全支持 UT...

红薯
2011/11/30
868
4
emqtt_lua_hook开发问题

@emqtt 你好,想跟你请教个问题: 在lua_hook中,想使用cjson这个so包时报错,请问为什么在hook中无法加载so包? emqttd/hook_lua/test.lua 而在外部lua脚本内使用cjson没有问题 test.lua [...

skypeng123
2017/09/12
24
0
Openresty最佳案例 | 第5篇:http和C_json模块

转载请标明出处: http://blog.csdn.net/forezp/article/details/78616672 本文出自方志朋的博客 http客户端 Openresty没有提供默认的Http客户端,需要下载第三方的http客户端。 下载lua-res...

forezp
2017/11/23
0
0
Lua CJSON 2.0 发布,Lua 的JSON处理器

Lua CJSON 2.0 发布了,该版本提升了性能和可移植性,另外增加对 Lua 5.2 的支持。 Lua CJSON 为 Lua 语言提供高性能的 JSON 解析器和编码器,其性能比纯 Lua 库要高 10 到 20 倍。Lua CJSON...

红薯
2012/01/23
1K
1
Lua CJSON 2.1.0 发布

Lua CJSON 2.1.0 发布了,该版本新增一个 cjson.safe 模块接口,该接口在解析错误时不抛出异常,而是返回 nil,改进了 Makefile 在solaris 下的兼容性。 Lua CJSON 为 Lua 语言提供高性能的 ...

红薯
2012/03/02
3.2K
0

没有更多内容

加载失败,请刷新页面

加载更多

分布式锁的实现

redis实现分布式锁 方法1:普通实现方案 实现方式: 使用指令: set key 随机值 ex 5 nx.意思是当key不存在的时候设置key. 如果key存在返回OK,否则返回nil. 实现过程: 1.执行命令set key true ...

grace_233
20分钟前
1
0
解决CKEditor 4 富文本编辑器在图片组件无法显示[上传]选项卡的相关问题

关于解决CKEditor 4 富文本编辑器在图片组件无法显示[上传]选项卡的相关问题。 本文可能会对以下现象得以解决: 图片上传组件,没有 [上传] 选项卡。 资源无法加载 [imgupload] ( Uncaught E...

Eller
23分钟前
0
0
限制php解析、user_agent、php相关配置

11月20日任务 11.28 限定某个目录禁止解析php 11.29 限制user_agent 11.30/11.31 php相关配置 11.28、限定某个目录禁止解析php 核心配置文件内容 <Directory /data/wwwroot/www.123.com/upl...

zgxlinux
28分钟前
1
0
博客园首页新随笔联系订阅管理 随笔

注解Annotation实现原理与自定义注解例子 什么是注解? 对于很多初次接触的开发者来说应该都有这个疑问?Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的...

onedotdot
45分钟前
4
1
Spring boot + redis 用RedisTemlate实现简单的String key value 操作

springboot集成redis, 简单的key, value缓存操作. 1. application-local.properties # redis on local#spring.redis.port=6379#spring.redis.host=localhost#spring.redis.password=......

园领T
58分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部