Ejemplo n.º 1
0
static PyObject *
_get_pyobj_from_array(rapidjson::Value::ConstValueIterator& doc,
                      PyObject *root)
{
    PyObject *obj;

    switch (doc->GetType()) {
    case rapidjson::kObjectType:
        obj = PyDict_New();
        for (rapidjson::Value::ConstMemberIterator itr = doc->MemberBegin();
             itr != doc->MemberEnd(); ++itr) {
            _get_pyobj_from_object(itr, obj, itr->name.GetString());
        }
        break;
    case rapidjson::kArrayType:
        obj = PyList_New(0);
        for (rapidjson::Value::ConstValueIterator itr = doc->Begin();
             itr != doc->End(); ++itr) {
            _get_pyobj_from_array(itr, obj);
        }
        break;
    case rapidjson::kTrueType:
        obj = PyBool_FromLong(1);
        break;
    case rapidjson::kFalseType:
        obj = PyBool_FromLong(0);
        break;
    case rapidjson::kStringType:
        obj = PyString_FromStringAndSize(doc->GetString(),
                                         doc->GetStringLength());
        break;
    case rapidjson::kNumberType:
        if (doc->IsDouble()) {
            char _tmp[100] = "";
            sprintf(_tmp, "%lf", doc->GetDouble());
            obj = PyFloat_FromDouble(atof(_tmp));
        }
        else {
            obj = PyInt_FromLong(doc->GetInt());
        }
        break;
    case rapidjson::kNullType:
        Py_INCREF(Py_None);
        obj = Py_None;
        break;
    default:
        printf("not support. type:%d\n", doc->GetType());
        return NULL;
    }

    _set_pyobj(root, obj, NULL);

    return root;
}
Ejemplo n.º 2
0
static PyObject *
doc2pyobj(rapidjson::Document& doc)
{
    PyObject *root;

    if (doc.IsArray()) {
        root = PyList_New(0);
        for (rapidjson::Value::ConstValueIterator itr = doc.Begin();
             itr != doc.End(); ++itr) {
            _get_pyobj_from_array(itr, root);
        }
    }
    else {
        // Object
        root = PyDict_New();
        for (rapidjson::Value::ConstMemberIterator itr = doc.MemberBegin();
             itr != doc.MemberEnd(); ++itr) {
            _get_pyobj_from_object(itr, root, itr->name.GetString());
        }
    }

    return root;
}
Ejemplo n.º 3
0
static PyObject *
_get_pyobj_from_object(rapidjson::Value::ConstMemberIterator& doc,
                       PyObject *root,
                       const char *key)
{
    PyObject *obj, *utf8item;

    switch (doc->value.GetType()) {
    case rapidjson::kObjectType:
        obj = PyDict_New();
        for (rapidjson::Value::ConstMemberIterator itr = doc->value.MemberBegin();
             itr != doc->value.MemberEnd(); ++itr) {
            _get_pyobj_from_object(itr, obj, itr->name.GetString());
        }
        break;
    case rapidjson::kArrayType:
        obj = PyList_New(0);
        for (rapidjson::Value::ConstValueIterator itr = doc->value.Begin();
             itr != doc->value.End(); ++itr) {
            _get_pyobj_from_array(itr, obj);
        }
        break;
    case rapidjson::kTrueType:
        obj = PyBool_FromLong(1);
        break;
    case rapidjson::kFalseType:
        obj = PyBool_FromLong(0);
        break;
    case rapidjson::kStringType:
#ifdef PY3
        obj = PyString_FromStringAndSize(doc->value.GetString(),
                                         doc->value.GetStringLength());
#else
        utf8item = PyUnicode_FromStringAndSize(doc->value.GetString(),
                                               doc->value.GetStringLength());
        if (utf8item) {
            obj = utf8item;
        } else {
            obj = PyString_FromStringAndSize(doc->value.GetString(),
                                         doc->value.GetStringLength());
        }
#endif
        break;
    case rapidjson::kNumberType:
        if (doc->value.IsDouble()) {
            obj = PyFloat_FromDouble(doc->value.GetDouble());
        }
        else {
            obj = PyInt_FromLong(doc->value.GetInt64());
        }
        break;
    case rapidjson::kNullType:
        Py_INCREF(Py_None);
        obj = Py_None;
        break;
    default:
        PyErr_SetString(PyExc_RuntimeError, "not support type");
        return NULL;
    }

    _set_pyobj(root, obj, key);
    return obj;
}