Archicad Python API
About automating tasks in Archicad using the Python API.

JSON Parser ObjectValueRef and ObjectValue meaning?

Mihalcea Bogdan
Contributor
The GET request I am trying to parse
Hi! I am trying to parse and traverse a JSON file from the link above.
After I successfully make the connection it is parsed and ready to do whatever I want with the Object.
I just don't know what to do... what kind of object is this? Is there any in depth documentation about this parser?

JSON::JDOMParser jParser;
JSON::ValueRef parsed = jParser.Parse(clientConnection.BeginReceive(response));
	JSON::ObjectValueRef obj = GS::DynamicCast<JSON::ObjectValue>(parsed);
	
	GS::UIndex idx = 0;
	GS::UniString name = obj->GetName(idx);//This gets me the value "results" as it should
	bool isObj = obj->IsObject();//true
	
	JSON::ValueRef resultsRef = obj->Get("results");//If I DBPrintf this it ouputs "Array"
I don't fully understand how to "navigate" or "read" the parsed Object. I didn't found any documentation about the JSON Parser below
JSON::JDOMParser
Can you please help me with some ideas how to traverse this JSON object?

Thank you!
3 REPLIES 3
Mihalcea Bogdan
Contributor

using namespace HTTP::Client;
	using namespace HTTP::MessageHeader;
	using namespace GS::IBinaryChannelUtilities;

	JSON::JDOMParser jParser;
	
	IO::URI::URI connectionUrl("http://geoportal.ancpi.ro/geoprocessing/rest/services/LOOKUP/UATLookup/GPServer/FastSelect/execute?f=json&Expression=WORKSPACEID=10");
	
	ClientConnection clientConnection(connectionUrl);
	clientConnection.Connect();

	Request getRequest(Method::Get, connectionUrl);

	getRequest.GetRequestHeaderFieldCollection().Add(HeaderFieldName::UserAgent,
		"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36");
	clientConnection.Send(getRequest);

	Response response;

	//Parse the top object of the JSON File
	JSON::ValueRef parsed = jParser.Parse(clientConnection.BeginReceive(response));
	JSON::ObjectValueRef obj = GS::DynamicCast<JSON::ObjectValue>(parsed);
	
	//Get the array named results into arrValRef
	GS::UniString atName = "results";
	JSON::ArrayValueRef arrValRef;
	obj->GetMandatoryMember(atName, arrValRef);

	//Get the first and single item of the array
	JSON::ValueRef first = arrValRef->Get(0);
	//Parse it again into an ObjectValueRef
	JSON::ObjectValueRef resultsObj = GS::DynamicCast<JSON::ObjectValue>(first);
	//debug so I can be sure what it is
	DBPrintf("Size of reultsObj is %u\n", resultsObj->GetSize());
	

	DBPrintf("Type of resultsObj[2] is %s\n", resultsObj->GetName(2).ToCStr().Get());

	//Get the third element from results array : "value" this is an object
	JSON::ValueRef valuesRef = resultsObj->Get(2);
	//Parse it into a ObjectvalueRef
	JSON::ObjectValueRef valuesObj = GS::DynamicCast<JSON::ObjectValue>(valuesRef);

	//Get the array I wanted finally, the features array containing information about cities
	JSON::ArrayValueRef fieldsArray;
	valuesObj->GetMandatoryMember("features", fieldsArray);

	//Iterate trough the "features" array
	for (unsigned int i = 0; i <= fieldsArray->GetSize(); i++) {

		//Debug to be sure that the correct one is selected
		DBPrintf("Working %u times\n", i);
	}
	

	/*GS::IChannelX channel(clientConnection.BeginReceive(response), GS::GetNetworkByteOrderIProtocolX());

	DBPrintf("HTTP %u\n", response.GetStatusCode());
	DBPrintf("Received data: \n");

	GS::UniString body = ReadUniStringAsUTF8(channel, StringSerializationType::NotTerminated);
	GS::Array<GS::UniString> lines;
	body.Split("\n", GS::UniString::KeepEmptyParts, &lines);
	for (GS::UniString& line : lines) {
		DBPrintf("%s\n", line.ToCStr(0, MaxUSize, GSCharCode::CC_Legacy).Get());
	}
	DBPrintf("Read %u characters, %u lines \n", body.GetLength(), lines.GetSize());*/
	   	 
	clientConnection.FinishReceive();
	clientConnection.Close(false);
Mihalcea Bogdan
Contributor
All of my entries should have been objects (79 objects)
The objects structure is like this:

"attributes": {
              "OID": 2,
              "ADMINISTRATIVEUNITID": 1213,
              "UAT": "Aiud"
            }
The JDOMParser gave me some inconsistent results as shown bellow.
Type of fieldsArray[0] is: Array
Type of fieldsArray[1] is: String
Type of fieldsArray[2] is: Unknown
Type of fieldsArray[3] is: Bool
Type of fieldsArray[4] is: Unknown
Type of fieldsArray[5] is: Unknown
Type of fieldsArray[6] is: String
Type of fieldsArray[7] is: Unknown
Type of fieldsArray[8] is: Unknown
Type of fieldsArray[9] is: Unknown
Type of fieldsArray[10] is: Null
Type of fieldsArray[11] is: Unknown
Type of fieldsArray[12] is: Bool
Type of fieldsArray[13] is: Unknown
Type of fieldsArray[14] is: Unknown
Type of fieldsArray[15] is: Null
Type of fieldsArray[16] is: Unknown
Type of fieldsArray[17] is: Unknown
Type of fieldsArray[18] is: Object
Type of fieldsArray[19] is: Array
Type of fieldsArray[20] is: Unknown
Type of fieldsArray[21] is: Null
Type of fieldsArray[22] is: Object
Type of fieldsArray[23] is: Unknown
Type of fieldsArray[24] is: Bool
Type of fieldsArray[25] is: Unknown
Type of fieldsArray[26] is: Unknown
Type of fieldsArray[27] is: Bool
Type of fieldsArray[28] is: Unknown
Type of fieldsArray[29] is: Unknown
Type of fieldsArray[30] is: Bool
Type of fieldsArray[31] is: Unknown
Type of fieldsArray[32] is: Unknown
Type of fieldsArray[33] is: Bool
Type of fieldsArray[34] is: Unknown
Type of fieldsArray[35] is: Unknown
Type of fieldsArray[36] is: Bool
Type of fieldsArray[37] is: Unknown
Type of fieldsArray[38] is: Unknown
Type of fieldsArray[39] is: Null
Type of fieldsArray[40] is: Unknown
Type of fieldsArray[41] is: Unknown
Type of fieldsArray[42] is: Object
Type of fieldsArray[43] is: Unknown
Type of fieldsArray[44] is: Unknown
Type of fieldsArray[45] is: Null
Type of fieldsArray[46] is: Null
Type of fieldsArray[47] is: Unknown
Type of fieldsArray[48] is: Bool
Type of fieldsArray[49] is: Unknown
Type of fieldsArray[50] is: Unknown
Type of fieldsArray[51] is: Unknown
Type of fieldsArray[52] is: Unknown
Type of fieldsArray[53] is: Unknown
Type of fieldsArray[54] is: Bool
Type of fieldsArray[55] is: Array
Type of fieldsArray[56] is: Unknown
Type of fieldsArray[57] is: Bool
Type of fieldsArray[58] is: Object
Type of fieldsArray[59] is: Unknown
Type of fieldsArray[60] is: Unknown
Type of fieldsArray[61] is: Unknown
Type of fieldsArray[62] is: Unknown
Type of fieldsArray[63] is: Unknown
Type of fieldsArray[64] is: Unknown
Type of fieldsArray[65] is: Unknown
Type of fieldsArray[66] is: Object
Type of fieldsArray[67] is: Unknown
Type of fieldsArray[68] is: Unknown
Type of fieldsArray[69] is: Unknown
Type of fieldsArray[70] is: Unknown
Type of fieldsArray[71] is: Unknown
Type of fieldsArray[72] is: String
Type of fieldsArray[73] is: Unknown
Type of fieldsArray[74] is: Unknown
Type of fieldsArray[75] is: Unknown
Type of fieldsArray[76] is: Unknown
Type of fieldsArray[77] is: Unknown
Type of fieldsArray[78] is: Number
Mihalcea Bogdan
Contributor
I found an interesting folder ... I think I solved my problem:
C:\Program Files\GRAPHISOFT\API Development Kit 24.3009\Support\Modules\RapidJSON
I will try to make it run now on other PC.

Didn't find the answer?

Check other topics in this Forum

Back to Forum

Read the latest accepted solutions!

Accepted Solutions

Start a new conversation!