用cocos2dx做跨平台项目的时候,自然就用了c++版本的json库,这个json-cpp是用的比较多的,总体用起来还算可以,有一个很不方便的地方就是不支持long long(int64)类型,一开始我使用double类型来强制转换,后来出了bug,double精度只有16位,超过20位的就会被四舍五入,试过了官网上bug列表里的方法都不行,
没办法,花点时间添加longValue才解决这个问题,加地方实在太多了,附上主要扩展代码备忘:
一,定义一个long类型
//lancer add long
typedef long
long Long;
二、
//类型里添加longValue
enum ValueType
{
nullValue = 0, ///< 'null' value
intValue, ///< signed integer value
uintValue, ///< unsigned integer value
//lancer add for longlong
longValue, //signed int 64
realValue, ///< double value
stringValue, ///< UTF-8 string value
booleanValue, ///< bool value
arrayValue, ///< array value (ordered list)
objectValue ///< object value (collection of name/value pairs).
};
三、添加一个解析long类型的方法
bool
Reader::decodeLongLong( Token &token )
{
Long value = 0;
const int bufferSize =
32;
int count;
int length = int(token.end_ - token.start_);
if ( length <= bufferSize )
{
Char buffer[bufferSize];
memcpy( buffer, token.start_, length );
buffer[length] = 0;
count = sscanf( buffer,
"%lld", &value );
}
else
{
std::string buffer( token.start_, token.end_ );
count = sscanf( buffer.c_str(),
"%lld", &value );
}
if ( count != 1 )
return addError(
"'" + std::string( token.start_, token.end_ ) +
"' is not a number.", token );
currentValue() = value;
return true;
}
四、解析数字
bool
Reader::decodeNumber( Token &token )方法里,超出int型数据范围的时候使用decodeLongLong方法,而不是之前的decodeDouble
while ( current < token.end_ )
{
Char c = *current++;
if ( c < '0' || c >
'9' )
return addError(
"'" + std::string( token.start_, token.end_ ) +
"' is not a number.", token );
if ( value >= threshold )
// return decodeDouble( token );
//lancer add for long long
return decodeLongLong( token );
value = value * 10 +
Value::UInt(c - '0');
}
五,添加一个asLongLong方法供调用
//lancer as long
Long Value::asLongLong()
const
{
switch ( type_ )
{
case nullValue:
return 0;
case intValue:
return value_.int_;
case uintValue:
JSON_ASSERT_MESSAGE(
value_.uint_ < (unsigned)maxInt,
"integer out of signed integer range" );
return value_.uint_;
case longValue:
return value_.long_;
case realValue:
JSON_ASSERT_MESSAGE(
value_.real_ >= minLong &&
value_.real_ <= maxLong,
"Real out of signed long range" );
return Long(
value_.real_ );
case
booleanValue:
return value_.bool_ ?
1 : 0;
case
stringValue:
{
//lancer safe long long
return atoll(value_.string_);
}
case arrayValue:
case
objectValue:
JSON_ASSERT_MESSAGE(
false, "Type is not convertible to int" );
default:
JSON_ASSERT_UNREACHABLE;
}
return
0; // unreachable;
}
其他地方细节要改的太多了,我都是全局搜索realValue,然后对应的地方改掉
另外,由于后台传输数据的时候数字可能会被传成字符串,所以解析数字的地方都需要加上对字符串的判断,
比如:
Value::Int
Value::asInt() const
{
switch ( type_ )
{
case stringValue:
{
//lancer safe int
return
atoi(value_.string_);
}
转载请保留以下信息:
作者(Author):smilelance
出处( From ):http://blog.csdn.net/smilelance
分享到:
相关推荐
JsonRpc-Cpp - JSON-RPC implementation. * Copyright (C) 2008-2011 Sebastien Vincent * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser ...
在Java世界里,`json-lib-2.1.jar` 是一个用于处理JSON的库,它提供了一系列的方法来将Java对象转换为JSON格式,以及将JSON字符串反序列化回Java对象。这个库支持多种Java类型,包括基本类型、集合、Map、自定义Java...
json-lib-2.4-jdk15.jar下载,json-lib是一款简单易用的Java JSON库。它可以将Java对象转换成JSON字符串,也可以将JSON字符串转换成Java对象。json-lib体积小、无依赖,性能表现也不错,适合在各种Java项目中使用。 ...
JSON-C库为这种需求提供了便利,它支持基本的JSON数据类型,如对象({})、数组([])、字符串、数字、布尔值和null。通过这个库,程序员可以将C结构体转换为JSON文本,或者从JSON文本中解析出C结构体,实现数据的...
5. **源码分析**:通过查看源码,开发者可以深入理解JSON-C库的工作原理,学习如何处理JSON数据,甚至可以根据需求进行自定义扩展。源码也是开源社区的基础,可以吸引其他开发者参与改进和维护。 6. **使用方法**:...
2. JSON数据类型的处理:JSON-c支持基本的数据类型,如数字、字符串、布尔值、数组和嵌套的对象。这些类型可以方便地与C语言中的数据类型相互转换。 3. 动态内存管理:JSON-c库处理了内存分配和释放,使得开发者...
5. **自定义逻辑**:在某些情况下,可能需要对`json-schema-inferrer`进行扩展,以满足特定的业务需求。例如,可以通过提供自定义的类型映射或者处理规则,来处理特定类型的属性或值。 6. **集成到项目中**:将`...
3. **动态类型系统**:JSON-c库允许JSON对象中的值是动态的,可以是整数、浮点数、字符串、布尔值、JSON对象或JSON数组,这与JSON的标准完全兼容。 4. **递归深度控制**:为了避免无限递归导致的栈溢出,`json-c`...
JSON-lib是Java平台上的一个库,它提供了一种方便的方式来序列化和反序列化Java对象为JSON格式,以及从JSON字符串恢复Java对象。这个库在处理JSON数据时非常实用,特别是对于那些需要在服务器端和客户端之间进行数据...
3. **自定义类型转换**:`json-lib`支持自定义类型转换规则,开发者可以根据需求定制Java对象到JSON的转换策略。 4. **XML与JSON互转**:除了基本的JSON操作,`json-lib`还提供了XML与JSON之间的转换功能,这对于...
3. **数据类型支持**:JSON-lib支持基本的JSON数据类型,如字符串、数字、布尔值,以及JSON数组和JSON对象。同时,它也支持将Java的复杂类型,如自定义对象、集合类和映射类转换为JSON。 4. **异常处理**:在处理...
在Java中,为了方便地处理JSON数据,有一个库叫做json-lib,它为Java提供了丰富的JSON操作API。json-lib-2.3.jar是这个库的一个版本,用于支持将Java对象转换成JSON格式和将JSON数据反序列化为Java对象。 标题中...
"json-handle-0.5.6.rar"就是这样一个工具,它是一个专为Chrome浏览器设计的插件,旨在帮助用户更高效地管理和理解JSON数据。 该插件名为"json-handle",版本号为0.5.6,表明这是一个经过多次迭代优化的稳定版本。...
3. **JSON与Java对象的互转**:JSON-Lib支持多种Java类型,包括基本类型、集合、Map等。例如,`String jsonString = obj.toString();`将JSON对象转换为字符串,而`Map, Object> map = JSONObject.toBean(JSONObject....
3. **扩展支持**:`json-schema-validator`支持多种JSON Schema扩展,如`format`关键字,用于验证日期、时间、URI等特殊格式。 4. **与其他框架的集成**:库可以方便地与Spring、Jackson、Gson等Java JSON处理框架...
7. **可扩展性**:android-json-rpc的设计允许开发者根据需求进行扩展,例如添加新的处理逻辑、自定义错误处理器等。 在实际使用中,开发者首先需要在项目中引入android-json-rpc库,可以通过Gradle或Maven依赖管理...
里面包含json-lib所需的全部jar文件. json-lib-2.1-jdk15.jar ezmorph-1.0.3.jar commons-beanutils.jar commons-collections-3.2.1.jar commons-lang-2.4.jar commons-logging-1.1.1.jar
`json-lib`是Java中一个著名的JSON处理库,它提供了多种Java API来操作JSON数据。`json-lib-2.4-jdk15-sources.jar`是这个库的源码版本,适用于JDK 1.5环境。源码文件对于开发者来说非常宝贵,因为它允许我们深入...
《在Windows环境下构建json-rpc-cpp项目》 json-rpc-cpp是一个强大的开源库,主要用于实现基于JSON-RPC协议的客户端和服务器端通信。它最初设计为在Linux环境中编译,但通过适当的修改,我们可以使其在Windows系统...
json-smart-2.0-RC3.jar 亲测,可用!