Xbasic

json_parse Function

Syntax

dim result as p = json_parse(jsonTxt as C [, flagJavascriptSyntax as L])

Arguments

jsonTxtCharacter

JSON formatted text.

flagJavascriptSyntaxLogical

Default = .f.. If the JSON string contains Javascript function definitions, this parameter must be set to .t., otherwise json_parse() may fail to parse the JSON.

Returns

resultPointer

Returns the JSON parsed as a dot variable.

Description

The json_parse function parses a string in JSON format and returns an Xbasic dot variable.

Discussion

JSON parse is one of the most important functions for dealing with JSON in Xbasic. The json_parse function parses a string in JSON format and returns an Xbasic dot variable. Keep in mind that Xbasic is case in-sensitive so if the JSON you are parsing has duplicate property names (with different cases), the resulting Xbasic dot variable will only have a single instance of the property.

? json_parse("{ foo : 1}")
= foo = 1

Json_parse can handle this incorrectly formatted json, i.e. JSON spec requires names be quoted. The json_parse() function can take an optional second argument to indicate if the JSON being parsed is a Javascript object literal rather than a JSON string. For example, the json_parse() function can interpret Javascript Date() functions in a JSON string. This allows you to parse JSON strings generated by the json_generate() function, if the json_generate() function generated a JSON string that uses the Date() function.

dim p as p 
p.name = "Fred" 
p.sayHello = "{javascript}function() { alert('hello');}"

Now, generate a Javascript object literal. Pass in .t. as the second argument to vartojson() to indicate that we want an Javascript object literal and not a JSON string.

dim jsObject as c 
jsObject = vartojson(p,.t.)

Here is what the resulting string looks like:

{
	name: 'Fred',
	sayHello: function() { alert('hello');}
}

Now, in order to be able to parse this object literal back to Xbasic, we use the json_parse() function but we set the optional second argument to .t.

dim pj as p
pj = json_parse(jsObject, .t.)
?pj.name 
= "Fred"

?pj.sayHello
= "{javascript}function() { alert('hello');}"
p2 = json_parse("[{name:\"Fred Smith\", age: 23 },{name:\"John Jones\", age: 45}]")

?p2[1]
= age = 23
name = "Fred Smith"

?p2[2]
= age = 45
name = "John Jones"

The following example shows a round trip using json_parse() and json_generate() to show how date and time values are preserved.

dim p1 as p
p1.name = "Karen"
p1.dob = date()
p1.time = now()

? json_generate(p1)
{
	"name": "Karen",
	"dob": Date('2016/10/26'),
	"time": Date('2016/10/26T23:52:28:130')
}

dim jsonTxt as c
jsonTxt = json_generate(p1)
dim p2 as p
p2 = json_parse(jsonTxt)

?p2
= dob = {10/26/2016}
name = "Karen"
time = 10/26/2016 11:52:28 13 pm

See Also