Пример #1
0
/**
 * Creates a JSON encoded string for the value with all necessary characters escaped
 *
 * @access public
 *
 * @return std::wstring Returns the JSON string
 */
std::wstring JSONValue::Stringify() const
{
    std::wstring ret_string;

    switch (type)
    {
    case JSONType_Null:
        ret_string = L"null";
        break;

    case JSONType_String:
        ret_string = StringifyString(string_value);
        break;

    case JSONType_Bool:
        ret_string = bool_value ? L"true" : L"false";
        break;

    case JSONType_Number:
    {
        if (isinf(number_value) || isnan(number_value))
            ret_string = L"null";
        else
        {
            std::wstringstream ss;
            ss.precision(15);
            ss << number_value;
            ret_string = ss.str();
        }
        break;
    }

    case JSONType_Array:
    {
        ret_string = L"[";
        JSONArray::const_iterator iter = array_value.begin();
        while (iter != array_value.end())
        {
            ret_string += (*iter)->Stringify();

            // Not at the end - add a separator
            if (++iter != array_value.end())
                ret_string += L",";
        }
        ret_string += L"]";
        break;
    }

    case JSONType_Object:
    {
        ret_string = L"{";
        JSONObject::const_iterator iter = object_value.begin();
        while (iter != object_value.end())
        {
            ret_string += StringifyString((*iter).first);
            ret_string += L":";
            ret_string += (*iter).second->Stringify();

            // Not at the end - add a separator
            if (++iter != object_value.end())
                ret_string += L",";
        }
        ret_string += L"}";
        break;
    }
    }

    return ret_string;
}
Пример #2
0
/**
 * Creates a JSON encoded string for the value with all necessary characters escaped
 *
 * @access private
 *
 * @param size_t indentDepth The prettyprint indentation depth (0 : no prettyprint)
 *
 * @return std::string Returns the JSON string
 */
std::string JSONValue::StringifyImpl(size_t const indentDepth) const
{
	std::string ret_string;
	size_t const indentDepth1 = indentDepth ? indentDepth + 1 : 0;
	std::string const indentStr = Indent(indentDepth);
	std::string const indentStr1 = Indent(indentDepth1);

	switch (type)
	{
		case JSONType_Null:
			ret_string = "nu";
			break;

		case JSONType_String:
			ret_string = StringifyString(string_value);
			break;

		case JSONType_Bool:
			ret_string = bool_value ? "true" : "false";
			break;

		case JSONType_Number:
		{
			if (isinf(number_value) || isnan(number_value))
				ret_string = "nu";
			else
			{
				std::stringstream ss;
				ss.precision(15);
				ss << number_value;
				ret_string = ss.str();
			}
			break;
		}

		case JSONType_Array:
		{
			ret_string = indentDepth ? "[\n" + indentStr1 : "[";
			JSONArray::const_iterator iter = array_value.begin();
			while (iter != array_value.end())
			{
				ret_string += (*iter)->StringifyImpl(indentDepth1);

				// Not at the end - add a separator
				if (++iter != array_value.end())
					ret_string += ",";
			}
			ret_string += indentDepth ? "\n" + indentStr + "]" : "]";
			break;
		}

		case JSONType_Object:
		{
			ret_string = indentDepth ? "{\n" + indentStr1 : "{";
			JSONObject::const_iterator iter = object_value.begin();
			while (iter != object_value.end())
			{
				ret_string += StringifyString((*iter).first);
				ret_string += ":";
				ret_string += (*iter).second->StringifyImpl(indentDepth1);

				// Not at the end - add a separator
				if (++iter != object_value.end())
					ret_string += ",";
			}
			ret_string += indentDepth ? "\n" + indentStr + "}" : "}";
			break;
		}
	}

	return ret_string;
}