Sample code for 30+ languages & platforms
PureBasic

JSON Paths

See more JSON Examples

Demonstrates using "Chilkat JSON Paths" to access parts of a JSON document, or to iterate over parts.

This example uses the following JSON document:

{
    "nestedArray" : [
			[
				[1,2,3],
				[4,5,6],
				[7,8,9,10]
			],
			[
				[11,12,13],
				[14,15,16],
				[17,18,19,20]
			],
			[
				[21,22,23],
				[24,25,26],
				[27,28,29,30],
				[31,32,33,34,35,36]
			]
		],

	"nestedObject" : {
		"aaa" : {
			"bb1" : {
				"cc1" : "c1Value",
				"cc2" : "c2Value",
				"cc3" : "c3Value"
			},
			"bb2" : {
				"dd1" : "d1Value",
				"dd2" : "d2Value",
				"dd3" : "d3Value"
			}
		}
	},

	"mixture" : {
		"arrayA" : [  
			{ "fruit": "apple", "animal": "horse", "job": "fireman", "colors": ["red","blue","green"] },
			{ "fruit": "pear", "animal": "plankton", "job": "waiter", "colors": ["yellow","orange","purple"] },
			{ "fruit": "kiwi", "animal": "echidna", "job": "astronaut", "colors": ["magenta","tan","pink"] }
			]
	},


        "name.with.dots" : { "grain" : "oats" }

	
}

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkJsonArray.pb"
IncludeFile "CkJsonObject.pb"

Procedure ChilkatExample()

    success.i = 0

    json.i = CkJsonObject::ckCreate()
    If json.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::setCkEmitCompact(json, 0)

    ; Assume the file contains the data as shown above..
    success = CkJsonObject::ckLoadFile(json,"qa_data/json/pathSample.json")
    If success = 0
        Debug CkJsonObject::ckLastErrorText(json)
        CkJsonObject::ckDispose(json)
        ProcedureReturn
    EndIf

    ; First, let's get the value of "cc1"
    ; The path to this value is: nestedObject.aaa.bb1.cc1
    Debug CkJsonObject::ckStringOf(json,"nestedObject.aaa.bb1.cc1")

    ; Now let's get number 18 from the nestedArray.
    ; It is located at nestedArray[1][2][1]
    ; (remember: Indexing is 0-based)
    Debug "This should be 18: " + Str(CkJsonObject::ckIntOf(json,"nestedArray[1][2][1]"))

    ; We can do the same thing in a more roundabout way using the 
    ; I, J, and K properties.  (The I,J,K properties will be convenient
    ; for iterating over arrays, as we'll see later.)
    CkJsonObject::setCkI(json, 1)
    CkJsonObject::setCkJ(json, 2)
    CkJsonObject::setCkK(json, 1)
    Debug "This should be 18: " + Str(CkJsonObject::ckIntOf(json,"nestedArray[i][j][k]"))

    ; Let's iterate over the array containing the numbers 17, 18, 19, 20.
    ; First, use the SizeOfArray method to get the array size:
    sz.i = CkJsonObject::ckSizeOfArray(json,"nestedArray[1][2]")
    ; The size should be 4.
    Debug "size of array = " + Str(sz) + " (should equal 4)"

    ; Now iterate...
    i.i
    For i = 0 To sz - 1
        CkJsonObject::setCkI(json, i)
        Debug Str(CkJsonObject::ckIntOf(json,"nestedArray[1][2][i]"))
    Next

    ; Let's use a triple-nested loop to iterate over the nestedArray:
    j.i
    k.i

    ; szI should equal 1.
    szI.i = CkJsonObject::ckSizeOfArray(json,"nestedArray")
    For i = 0 To szI - 1
        CkJsonObject::setCkI(json, i)

        szJ.i = CkJsonObject::ckSizeOfArray(json,"nestedArray[i]")
        For j = 0 To szJ - 1
            CkJsonObject::setCkJ(json, j)

            szK.i = CkJsonObject::ckSizeOfArray(json,"nestedArray[i][j]")
            For k = 0 To szK - 1
                CkJsonObject::setCkK(json, k)

                Debug Str(CkJsonObject::ckIntOf(json,"nestedArray[i][j][k]"))
            Next
        Next
    Next

    ; Now let's examine how to navigate to JSON objects contained within JSON arrays.
    ; This line of code gets the value "kiwi" contained within "mixture"
    Debug CkJsonObject::ckStringOf(json,"mixture.arrayA[2].fruit")

    ; This line of code gets the color "yellow"
    Debug CkJsonObject::ckStringOf(json,"mixture.arrayA[1].colors[0]")

    ; Getting an object at a path:
    ; This gets the 2nd object in "arrayA"

    obj2.i = CkJsonObject::ckCreate()
    If obj2.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckObjectOf2(json,"mixture.arrayA[1]",obj2)

    ; This object's "animal" should be "plankton"
    Debug CkJsonObject::ckStringOf(obj2,"animal")

    ; Note that paths are relative to the object, not the absolute root of the JSON document.
    ; Starting from obj2, "purple" is at "colors[2]"
    Debug CkJsonObject::ckStringOf(obj2,"colors[2]")

    ; Getting an array at a path:
    ; This gets the array containing the colors red, green, blue:

    arr1.i = CkJsonArray::ckCreate()
    If arr1.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkJsonObject::ckArrayOf2(json,"mixture.arrayA[0].colors",arr1)

    szArr1.i = CkJsonArray::ckSize(arr1)
    For i = 0 To szArr1 - 1
        Debug Str(i) + ": " + CkJsonArray::ckStringAt(arr1,i)
    Next

    ; The Chilkat JSON path uses ".", "[", and "]" chars for separators.  When a name
    ; contains one of these chars, use double-quotes in the path:
    Debug CkJsonObject::ckStringOf(json,Chr(34) + "name.with.dots" + Chr(34) + ".grain")


    CkJsonObject::ckDispose(json)
    CkJsonObject::ckDispose(obj2)
    CkJsonArray::ckDispose(arr1)


    ProcedureReturn
EndProcedure