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; }
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; }
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; }