`
java-mans
  • 浏览: 11710535 次
文章分类
社区版块
存档分类
最新评论

json-cpp longlong 类型的扩展

 
阅读更多

用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

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

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    在Java世界里,`json-lib-2.1.jar` 是一个用于处理JSON的库,它提供了一系列的方法来将Java对象转换为JSON格式,以及将JSON字符串反序列化回Java对象。这个库支持多种Java类型,包括基本类型、集合、Map、自定义Java...

    json-lib-2.4-jdk15.jar下载

    json-lib-2.4-jdk15.jar下载,json-lib是一款简单易用的Java JSON库。它可以将Java对象转换成JSON字符串,也可以将JSON字符串转换成Java对象。json-lib体积小、无依赖,性能表现也不错,适合在各种Java项目中使用。 ...

    json-c-0.3.tar.gz_JSON_json linux_json-c_linux json

    JSON-C库为这种需求提供了便利,它支持基本的JSON数据类型,如对象({})、数组([])、字符串、数字、布尔值和null。通过这个库,程序员可以将C结构体转换为JSON文本,或者从JSON文本中解析出C结构体,实现数据的...

    json-c0.13.1Release.rar

    5. **源码分析**:通过查看源码,开发者可以深入理解JSON-C库的工作原理,学习如何处理JSON数据,甚至可以根据需求进行自定义扩展。源码也是开源社区的基础,可以吸引其他开发者参与改进和维护。 6. **使用方法**:...

    json-c-0.12.tar.gz_JSON_json 0.12_json-c-0.12_json-c-0.12下载

    2. JSON数据类型的处理:JSON-c支持基本的数据类型,如数字、字符串、布尔值、数组和嵌套的对象。这些类型可以方便地与C语言中的数据类型相互转换。 3. 动态内存管理:JSON-c库处理了内存分配和释放,使得开发者...

    JSON Schema 生成库——json-schema-inferrer(java版).rar

    5. **自定义逻辑**:在某些情况下,可能需要对`json-schema-inferrer`进行扩展,以满足特定的业务需求。例如,可以通过提供自定义的类型映射或者处理规则,来处理特定类型的属性或值。 6. **集成到项目中**:将`...

    json-c 一个用于c语言的json解析库,很强大

    3. **动态类型系统**:JSON-c库允许JSON对象中的值是动态的,可以是整数、浮点数、字符串、布尔值、JSON对象或JSON数组,这与JSON的标准完全兼容。 4. **递归深度控制**:为了避免无限递归导致的栈溢出,`json-c`...

    json-lib应用所有jar

    JSON-lib是Java平台上的一个库,它提供了一种方便的方式来序列化和反序列化Java对象为JSON格式,以及从JSON字符串恢复Java对象。这个库在处理JSON数据时非常实用,特别是对于那些需要在服务器端和客户端之间进行数据...

    json-lib-2.3-jdk15开发包和所有依赖包

    3. **自定义类型转换**:`json-lib`支持自定义类型转换规则,开发者可以根据需求定制Java对象到JSON的转换策略。 4. **XML与JSON互转**:除了基本的JSON操作,`json-lib`还提供了XML与JSON之间的转换功能,这对于...

    JSON-lib包json-lib-0.8.jar和json-lib-0.9.jar包

    3. **数据类型支持**:JSON-lib支持基本的JSON数据类型,如字符串、数字、布尔值,以及JSON数组和JSON对象。同时,它也支持将Java的复杂类型,如自定义对象、集合类和映射类转换为JSON。 4. **异常处理**:在处理...

    json-lib-2.3.jar

    在Java中,为了方便地处理JSON数据,有一个库叫做json-lib,它为Java提供了丰富的JSON操作API。json-lib-2.3.jar是这个库的一个版本,用于支持将Java对象转换成JSON格式和将JSON数据反序列化为Java对象。 标题中...

    json-handle-0.5.6.rar

    "json-handle-0.5.6.rar"就是这样一个工具,它是一个专为Chrome浏览器设计的插件,旨在帮助用户更高效地管理和理解JSON数据。 该插件名为"json-handle",版本号为0.5.6,表明这是一个经过多次迭代优化的稳定版本。...

    json-lib-2.4 jar 程序文件

    3. **JSON与Java对象的互转**:JSON-Lib支持多种Java类型,包括基本类型、集合、Map等。例如,`String jsonString = obj.toString();`将JSON对象转换为字符串,而`Map, Object&gt; map = JSONObject.toBean(JSONObject....

    JSON Schema 校验库——json-schema-validator(java版本).rar

    3. **扩展支持**:`json-schema-validator`支持多种JSON Schema扩展,如`format`关键字,用于验证日期、时间、URI等特殊格式。 4. **与其他框架的集成**:库可以方便地与Spring、Jackson、Gson等Java JSON处理框架...

    android-json-rpc

    7. **可扩展性**:android-json-rpc的设计允许开发者根据需求进行扩展,例如添加新的处理逻辑、自定义错误处理器等。 在实际使用中,开发者首先需要在项目中引入android-json-rpc库,可以通过Gradle或Maven依赖管理...

    json-lib-2.1

    里面包含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-2.4-jdk15-sources.jar

    `json-lib`是Java中一个著名的JSON处理库,它提供了多种Java API来操作JSON数据。`json-lib-2.4-jdk15-sources.jar`是这个库的源码版本,适用于JDK 1.5环境。源码文件对于开发者来说非常宝贵,因为它允许我们深入...

    libjson-rpc-cpp.rar

    《在Windows环境下构建json-rpc-cpp项目》 json-rpc-cpp是一个强大的开源库,主要用于实现基于JSON-RPC协议的客户端和服务器端通信。它最初设计为在Linux环境中编译,但通过适当的修改,我们可以使其在Windows系统...

    json-smart-2.0-RC3

    json-smart-2.0-RC3.jar 亲测,可用!

Global site tag (gtag.js) - Google Analytics