lua cjson数字问题

梦想游戏人
目录:
C/C++

在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);
	}
}

重新编译 即可

Scroll Up