adsense



[cocos2d-x] JSON <-> ValueMap convert

/*Header*/
Value parseJSON2Value(rapidjson::Value& value);
ValueMap JSON2ValueMap(string jsonstr);
string parseValueMap2JSON(const Value& value);
string ValueMap2JSON(ValueMap vdata);
 
/*cpp*/
Value parseJSON2Value(rapidjson::Value& value)
{
switch (value.GetType())
{
case rapidjson::Type::kTrueType:
return Value(true);
break;
case rapidjson::Type::kFalseType:
return Value(false);
break;
case rapidjson::Type::kNullType:
return Value();
break;
case rapidjson::Type::kStringType:
return Value(value.GetString());
break;
case rapidjson::Type::kNumberType:
if (value.IsDouble())
return Value(value.GetDouble());
if (value.IsInt())
return Value(value.GetInt());
if (value.IsFloat())
return Value(value.GetFloat());
break;
case rapidjson::Type::kArrayType:
{
ValueVector _vector;
for (rapidjson::SizeType i = 0; i < value.Size(); i++)
{
auto _element = parseJSON2Value(value[i]);
_vector.push_back(_element);
}
return Value(_vector);
}
break;
}
 
return Value();
}
ValueMap JSON2ValueMap(string jsonstr)
{
ValueMap result;
 
rapidjson::Document d;
if (d.Parse(jsonstr.c_str()).HasParseError())
{
CCLOG("parse error %d", (int)(d.Parse(jsonstr.c_str()).GetParseError()));
return result;
}
//d is rapidjson::Type::kObjectType
for (auto it = d.MemberBegin(); it != d.MemberEnd(); ++it)
{
string _key = it->name.GetString();
auto _element = parseJSON2Value(it->value);
result[_key] = _element;
}
 
return result;
}
 
string parseValueMap2JSON(const Value& value)
{
string ret;
switch (value.getType())
{
case Value::Type::BOOLEAN:
ret = value.asBool() ? "true" : "false";
break;
case Value::Type::DOUBLE:
ret = SPRINTF("%f", value.asDouble());
break;
case Value::Type::FLOAT:
ret = SPRINTF("%f", value.asFloat());
break;
case Value::Type::INTEGER:
ret = SPRINTF("%d", value.asInt());
break;
case Value::Type::STRING:
ret = SPRINTF("%s", value.asString().c_str());
break;
case Value::Type::VECTOR:
{
ret = "[\n";
for (const auto val2 : value.asValueVector())
{
auto element = parseValueMap2JSON(val2);
ret += SPRINTF("%s,", element.c_str());
}
ret = ret.substr(0, ret.length() - 1);
ret += "\n]";
}
break;
}
 
return ret;
}
string ValueMap2JSON(ValueMap vdata)
{
string jsonwriter = "{\n";
 
for (auto& keyval : vdata)
{
string key = keyval.first;
const Value& val = keyval.second;
auto element = parseValueMap2JSON(val);
jsonwriter += SPRINTF("\"%s\":%s,\n", keyval.first.c_str(), element.c_str());
}
jsonwriter = jsonwriter.substr(0, jsonwriter.length() - 2);
jsonwriter += "\n}";
 
rapidjson::Document d;
if (d.Parse(jsonwriter.c_str()).HasParseError())
{
CCLOG("parse error %d", (int)(d.Parse(jsonwriter.c_str()).GetParseError()));
return "";
}
 
return jsonwriter;
}



JSON 문자열을 ValueMap으로 : JSON2ValueMap

ValueMap을 JSON 문자열로 : ValueMap2JSON

지원하는 자료형 : int, float, double, bool, string, array(ValueVector)

※ValueVector에 자료형을 섞어넣으면 변환된 JSON문자열은 파싱 에러가 납니다. 특히 number형은 int면 int, float면 float 명시 필요

주된 용도 : 게임 중에는 ValueMap으로 데이터를 관리하고, 서버에 데이타를 업로드 할 때는 JSON 문자열 하나로 만들어서 올리기



덧글

댓글 입력 영역


Books

Geek라이프

메가 드라이브 퍼펙트 카탈로그
마에다 히로유키 저/조기현 역

미소녀 일러스트 테크닉
B-은하, pen스케, 카와이 저/정유진 역

핵심강좌! Cocos2d-x
이재환 저

피규어의 교과서 레진 키트 & 도색 입문 편
후지타 시게토시 저/김정규 역
예스24 | 애드온2
일본서적 전문사이트 NEPIC