{"id":3373,"date":"2020-07-29T16:29:59","date_gmt":"2020-07-29T16:29:59","guid":{"rendered":"https:\/\/raspberry-projects.com\/pi\/?p=3373"},"modified":"2020-08-06T12:48:33","modified_gmt":"2020-08-06T12:48:33","slug":"reading-json","status":"publish","type":"post","link":"https:\/\/raspberry-projects.com\/pi\/programming-in-c\/networking\/json\/rapidjson\/reading-json","title":{"rendered":"Reading Json"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Resources for reading<\/h4>\n\n\n\n<p><a href=\"https:\/\/rapidjson.org\/md_doc_tutorial.html\">https:\/\/rapidjson.org\/md_doc_tutorial.html<\/a><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Reading json from a String<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/rapidjson needs:\n#include \"rapidjson\/document.h\"\nusing namespace rapidjson;\n\n\t\/\/Open json for reading\n\tDocument JsonDocument;\n\tValue::ConstMemberIterator JsonField;\n\tValue::ConstMemberIterator JsonFieldNested1;\n\tstring JsonFieldName;\n\tstring JsonFieldString;\n\tint JsonFieldInt;\n\n\tif (!JsonDocument.Parse(MyJsonString.c_str()).HasParseError())\n\t{\n\n\t\t\/\/Getting a string\n\t\tJsonField = JsonDocument.FindMember(\"MyFieldName1\");\n\t\tif ( (JsonField != JsonDocument.MemberEnd()) &amp;&amp; (JsonField->value.IsString()) )\n\t\t\tJsonFieldString = JsonField->value.GetString();\n\n\n\t\t\/\/Getting an int\n\t\tJsonField = JsonDocument.FindMember(\"MyFieldName2\");\n\t\tif ( (JsonField != JsonDocument.MemberEnd()) &amp;&amp; (JsonField->value.IsInt()) )\n\t\t\tJsonFieldInt = JsonField->value.GetInt();\n\n\n\t\t\/\/Getting a nested field (you can't read nested fields as a new string, they are an object)\n\t\tJsonField = JsonDocument.FindMember(\"MyFieldName3\");\n\t\tif ( (JsonField != JsonDocument.MemberEnd()) &amp;&amp; (JsonField->value.IsObject()) )\n\t\t{\n\t\t\tJsonFieldNested1 = JsonField->value.FindMember(\"MySubFieldName1\");\n\t\t\tif ( (JsonFieldNested1 != JsonDocument.MemberEnd()) &amp;&amp; (JsonFieldNested1->value.IsString()) )\n\t\t\t{\n\t\t\t\tMyString = JsonFieldNested1->value.GetString();\n\t\t\t}\n\t\t}\n\n\t\t\/\/Iterating through nested fields (e.g. \"MyFieldWithSubFields\": { \"MySubfield1\": \"abc\", \"MySubfield2\": \"24\" }\n\t\tJsonField = JsonDocument.FindMember(\"MyFieldWithSubFields\");\n\t\tif ( (JsonField != JsonDocument.MemberEnd()) &amp;&amp; (JsonField->value.IsObject()) )\t\t\/\/Structures in a json doc are not a string in rapidjson and can't be read as a string, they are an object\n\t\t{\n\t\t\t\/\/ITERATE THROUGH EACH MEMBER\n\t\t\tfor (Value::ConstMemberIterator JsonIteratorMember = JsonField->value.MemberBegin(); JsonIteratorMember != JsonField->value.MemberEnd(); ++JsonIteratorMember)\n\t\t\t{\n\t\t\t\t\/\/Get key name\n\t\t\t\tJsonFieldName = JsonIteratorMember->name.GetString();\n\n\t\t\t\t\/\/Get value\n\t\t\t\tif (JsonIteratorMember->value.IsNumber())\n\t\t\t\t{\n\t\t\t\t\tJsonFieldInt = JsonIteratorMember->value.GetInt();\n\t\t\t\t}\n\t\t\t\telse if (JsonIteratorMember->value.IsString())\n\t\t\t\t{\n\t\t\t\t\tJsonFieldString = JsonIteratorMember->value.GetString();\n\t\t\t\t}\n\t\t\t\telse if (JsonIteratorMember->value.IsBool())\n\t\t\t\t{\n\t\t\t\t\tJsonFieldInt = (int)JsonIteratorMember->value.GetBool();\n\t\t\t\t}\n\t\t\t\telse if (JsonIteratorMember->value.IsArray())\n\t\t\t\t{\n\t\t\t\t\tfor (SizeType Index = 0; Index &lt; JsonIteratorMember->value.Size(); Index++)\n\t\t\t\t\t{\n\t\t\t\t\t\tif (JsonIteratorMember->value&#91;Index].IsNumber())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tJsonFieldInt = JsonIteratorMember->value&#91;Index].GetInt() ;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (JsonIteratorMember->value&#91;Index].IsString())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tJsonFieldString = JsonIteratorMember->value&#91;Index].GetString();\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (JsonIteratorMember->value&#91;Index].IsBool())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tJsonFieldInt = (int)JsonIteratorMember->value&#91;Index].GetBool();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t} \/\/for (Value::ConstMemberIterator JsonIteratorMember = JsonField->value.MemberBegin(); JsonIteratorMember != JsonField->value.MemberEnd(); ++JsonIteratorMember)\n\t\t}\n\n\n\t} \/\/if (!JsonDocument.Parse(MyJsonString.c_str()).HasParseError())<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Get json value functions<\/h4>\n\n\n\n<h5 class=\"wp-block-heading\">Calling<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>\tJsonField = JsonDocument.FindMember(\"MyFieldName1\");\n\tif (JsonField != JsonDocument.MemberEnd())\n\t\tJsonFieldString = JsonFieldGetValueAsString(JsonField);<\/code><\/pre>\n\n\n\n<h5 class=\"wp-block-heading\">The functions<\/h5>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/****************************************************\n\/\/****************************************************\n\/\/********** JSON FIELD GET VALUE AS STRING **********\n\/\/****************************************************\n\/\/****************************************************\n\/\/We always return a string regardless of json value type\nstring JsonFieldGetValueAsString (Value::ConstMemberIterator JsonField)\n{\n\tstringstream ss1;\n\t\n\tif (JsonField->value.IsInt())\n\t\tss1 &lt;&lt; JsonField->value.GetInt();\n\telse if (JsonField->value.IsInt64())\n\t\tss1 &lt;&lt; JsonField->value.GetInt64();\n\telse if (JsonField->value.IsDouble())\n\t\tss1 &lt;&lt; JsonField->value.GetDouble();\n\telse if (JsonField->value.IsUint())\n\t\tss1 &lt;&lt; JsonField->value.GetUint();\n\telse if (JsonField->value.IsUint64())\n\t\tss1 &lt;&lt; JsonField->value.GetUint64();\n\telse if (JsonField->value.IsNumber())\n\t\tss1 &lt;&lt; JsonField->value.GetInt();\n\telse if (JsonField->value.IsBool())\n\t\tss1 &lt;&lt; (int)(JsonField->value.GetBool() ? 1 : 0);\n\telse if (JsonField->value.IsString())\n\t\tss1 &lt;&lt; JsonField->value.GetString();\n\telse\n\t\tss1 &lt;&lt; \"\";\n\t\n\treturn (ss1.str());\n}\n\n\n\/\/*************************************************\n\/\/*************************************************\n\/\/********** JSON FIELD GET VALUE AS INT **********\n\/\/*************************************************\n\/\/*************************************************\n\/\/We always return an int64 regardless of json value type\n\/\/Defaults to 0\nint64_t JsonFieldGetValueAsInt64 (Value::ConstMemberIterator JsonField)\n{\n\tstringstream ss1;\n\tint64_t Value;\n\t\n\tif (JsonField->value.IsInt())\n\t\tValue = JsonField->value.GetInt();\n\telse if (JsonField->value.IsInt64())\n\t\tValue = JsonField->value.GetInt64();\n\telse if (JsonField->value.IsDouble())\n\t\tValue = rint(JsonField->value.GetDouble());\n\telse if (JsonField->value.IsUint())\n\t\tValue = JsonField->value.GetUint();\n\telse if (JsonField->value.IsUint64())\n\t\tValue = JsonField->value.GetUint64();\n\telse if (JsonField->value.IsNumber())\n\t\tValue = JsonField->value.GetInt();\n\telse if (JsonField->value.IsBool())\n\t\tValue = (uint64_t)(JsonField->value.GetBool() ? 1 : 0);\n\telse if (JsonField->value.IsString())\n\t{\n\t\tss1 &lt;&lt; JsonField->value.GetString();\n\t\tss1 >> Value;\n\t}\n\telse\n\t\tValue = 0;\n\t\n\treturn(Value);\n}\n\n\n\/\/****************************************************\n\/\/****************************************************\n\/\/********** JSON FIELD GET VALUE AS DOUBLE **********\n\/\/****************************************************\n\/\/****************************************************\n\/\/We always return an double regardless of json value type\n\/\/Defaults to 0\ndouble JsonFieldGetValueAsDouble (Value::ConstMemberIterator JsonField)\n{\n\tstringstream ss1;\n\tdouble Value;\n\t\n\tif (JsonField->value.IsInt())\n\t\tValue = (double)JsonField->value.GetInt();\n\telse if (JsonField->value.IsInt64())\n\t\tValue = (double)JsonField->value.GetInt64();\n\telse if (JsonField->value.IsDouble())\n\t\tValue = JsonField->value.GetDouble();\n\telse if (JsonField->value.IsUint())\n\t\tValue = (double)JsonField->value.GetUint();\n\telse if (JsonField->value.IsUint64())\n\t\tValue = (double)JsonField->value.GetUint64();\n\telse if (JsonField->value.IsNumber())\n\t\tValue = (double)JsonField->value.GetInt();\n\telse if (JsonField->value.IsBool())\n\t\tValue = (double)(JsonField->value.GetBool() ? 1 : 0);\n\telse if (JsonField->value.IsString())\n\t{\n\t\tss1 &lt;&lt; JsonField->value.GetString();\n\t\tss1 >> Value;\n\t}\n\telse\n\t\tValue = 0;\n\t\n\treturn(Value);\n}<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Read json from a file<\/h4>\n\n\n\n<pre class=\"wp-block-code\"><code>#include \"rapidjson\/filereadstream.h\"\n#include &lt;cstdio>\nusing namespace rapidjson;\n\n\tFILE* MyFile = fopen(FilePath.str().c_str(), \"r\");\n\tchar ReadBuffer&#91;65536];\n\tFileReadStream MyJsonReadStream(MyFile, ReadBuffer, sizeof(ReadBuffer));\n\tif(MyFile != NULL)\n\t\tfclose(MyFile);\n\tif (!JsonDocument.ParseStream(MyJsonReadStream).HasParseError())\n\t{<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Resources for reading https:\/\/rapidjson.org\/md_doc_tutorial.html Reading json from a String Get json value functions Calling The functions Read json from a file<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[163],"tags":[],"class_list":["post-3373","post","type-post","status-publish","format-standard","hentry","category-rapidjson"],"_links":{"self":[{"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/posts\/3373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/comments?post=3373"}],"version-history":[{"count":17,"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/posts\/3373\/revisions"}],"predecessor-version":[{"id":3418,"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/posts\/3373\/revisions\/3418"}],"wp:attachment":[{"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/media?parent=3373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/categories?post=3373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/raspberry-projects.com\/pi\/wp-json\/wp\/v2\/tags?post=3373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}