LoadString

Description

Loads a JSON string to the JSONParser or JSONPackage objects.

Applies to

JSONParser and JSONPackage

Required JSON format

  • For JSONParser object: The string that can be loaded by the JSONParser object must be JSON-formatted.

  • For JSONPackage object: The string that can be loaded by the JSONPackage object must be an object which contains a set of key/value pairs where key is the name of a JSONObjectItem-type object (corresponding to the data being added into the package, such as "d_department" and "d_employee_syntax") and the value for the key can be a string, object, or array in the following formats: plain JSON, or DataWindow JSON.

    Here is the structure of this JSON format:

    { "KEY1":VALUE1, "KEY2":VALUE2, "KEY3":VALUE3… }

    Here is an example of this JSON format:

    {
    "d_department": {"department_id":1, "name":"developer"},
    "d_employee": [{"empoyee_id":1, "name":"my name1"}, {"empoyee_id":2, "name":"my name2"}],
    "d_employee_syntax": "release 17;\r\n datawindow(units=0 timer_interval=0 color=1073741824..."
    }
    

    If the root of the JSON string is an array (not an object), as shown below, it is NOT supported by JSONPackage (but supported by JSONParser):

    [{"id":1, "name":"evan1", "birthday":2340323884}]

    You can change the JSON string like below, so it can be supported by JSONPackage:

    {"id":1, "name":"evan1", "birthday":2340323884}

    or

    {"data":[{"id":1, "name":"evan1", "birthday":2340323884}]}

Note

To make sure your JSON file or JSON string is in the standard JSON format, you can use any third-party tool (such as the online JSON tool) to validate the JSON format.

Syntax

objectname.LoadString ( JsonData )

Argument

Description

objectname

The name of the JSONParser or JSONPackage object to which the JSON string will be loaded.

JsonData

(For JSONParser object) A JSON-formatted string.

(For JSONPackage object) The JSON data of JsonObjectItem type.


Return value

String.

Returns the empty string ("") if it succeeds and the error message if an error occurs. If any argument's value is null, the method returns null.

Usage

If a string is already loaded by this function, calling this function again will clean up the original string and then load the new string.

After the JSON string is loaded, you can get the data through the following methods:

  • gets an array according to its item path. See below Example 3.

  • gets the JSON string of an array according to its item handle. See below Example 4.

  • gets the item handle from a JSONParser object according to the item path from a two-dimensional array. See below Example 5.

  • gets the total number of child items according to the parent item handle and then gets the value of every array item in a loop. See below Example 6.

  • determines the type of number values according to the item handle. See below Example 7.

  • handles an irregular JSON string which contains a null value. See below Example 8.

Examples

Example 1: This example loads a JSON string into the JSONParser object.

String ls_Error
JsonParser lnv_JsonParser 
lnv_JsonParser = Create JsonParser

String ls_Json = '{"id":1, "name":"evan1", "birthday":2340323884}'
ls_Error = lnv_JsonParser.LoadString(ls_Json)
if Len(ls_Error) > 0 then
 MessageBox("Error", ls_Error)
end if

Example 2: This example gets the data from the server and then loads the "d_employee" data to the DataWindow.

int li_rc
string ls_JsonPackage, ls_Error, ls_EmployeeJson
HttpClient lnv_HttpClient
JsonPackage lnv_package

lnv_HttpClient = create HttpClient
lnv_package = create JsonPackage

// Request the JSON data package from server
li_rc = lnv_HttpClient.SendRequest("GET", "https://demo.appeon.com/PB/webapi_client/getjsonpackage/employee/102")

// Get the data
if li_rc = 1 and lnv_HttpClient.GetResponseStatusCode() = 200 then
	lnv_HttpClient.GetResponseBody(ls_JsonPackage)
	// Extract the JSON data package
	ls_Error = lnv_package.LoadString(ls_JsonPackage)
	if Len(ls_Error) = 0 then
		ls_EmployeeJson = lnv_package.GetValue("d_employee")
		dw_1.ImportJson(ls_EmployeeJson)
	else
		Messagebox("Error", ls_Error)
	end if
end if

Example 3: The following code gets an array according to its item path.

JsonParser lnv_JsonParser
String ls_Json, ls_name, ls_Path
Long ll_number_item, ll_number, ll_object_item
Long ll_department_array
lnv_JsonParser = Create JsonParser

ls_Json = '{"id":1001, "name":"evan", "department_array":[999999, {"name":"Website"}, {"name":"PowerBuilder"}, {"name":"IT"}] }'

lnv_JsonParser.LoadString(ls_Json)
ls_Path = "/department_array"

ll_department_array = lnv_JsonParser.GetItemArray(ls_Path)

ll_number_item = lnv_JsonParser.GetChildItem(ll_department_array, 1)
ll_number = lnv_JsonParser.GetItemNumber(ll_number_item)
ll_object_item = lnv_JsonParser.GetChildItem(ll_department_array, 2)
ls_name = lnv_JsonParser.GetItemString(ll_object_item, "name")

Example 4: The following code gets the JSON string of an array according to its item handle.

JsonParser lnv_JsonParser
String ls_Json, ls_Array
Long ll_RootObject, ll_ChildArray, ll_Handle
lnv_JsonParser = Create JsonParser

ls_Json = '{"id":1001, "name":"svan", "active":true,"array":[12,34,[56,78]]}'

lnv_JsonParser.LoadString(ls_Json)
ll_RootObject = lnv_JsonParser.GetRootItem()
ll_ChildArray = lnv_JsonParser.GetItemArray(ll_RootObject,"array")
ll_Handle = lnv_JsonParser.GetChildItem(ll_ChildArray, 3)
ls_Array = lnv_JsonParser.GetItemArrayJSONString(ll_Handle)

Example 5: This example gets the item handle from a JSONParser object according to the item path from a two-dimensional array. The number indicates the order of the array.

JsonParser lnv_JsonParser
String ls_Json, ls_Name, ls_Path
DateTime ldt_DateTime
Long ll_item
lnv_JsonParser = Create JsonParser

ls_Json = '[{"id":1001, "name":"evan", "data_object":{"datetime":7234930293, "date": "2017-09-21", "time": "12:00:00","age":[66,22,33]}},' + &
    '{"id":1002, "name":"evan2", "data_object":{"datetime":1734930293, "date": "2017-09-11", "time": "11:00:00","age":[55,23,33]}}]'

lnv_JsonParser.LoadString(ls_Json)
ls_Path = "/1/name"
ll_item = lnv_JsonParser.GetItemByPath(ls_Path)
ls_Name = lnv_JsonParser.GetItemString(ll_item)
ls_Path = "/2/data_object/datetime"
ll_item = lnv_JsonParser.GetItemByPath(ls_Path)
ldt_DateTime = lnv_JsonParser.GetItemDateTime(ll_item)

Example 6: This example gets the total number of child items according to the parent item handle and then gets the value of every array item in a loop.

String ls_Json, ls_Name
Long ll_ChildCount, ll_Index, ll_Id, ll_ArrayItem, ll_ObjectItem
Datetime ldt_Birthday
JsonParser lnv_JsonParser

lnv_JsonParser = Create JsonParser

ls_Json = '[{"id":1, "name":"evan1", "birthday":2340323884}, {"id":2, "name":"evan2", "birthday":5340324801}]'

// Loads a JSON string
lnv_JsonParser.LoadString(ls_Json)
Long ll_ArrayItem = lnv_JsonParser.GetRootItem() // Root item is JsonArrayItem!
ll_ChildCount = lnv_JsonParser.GetChildCount(ll_ArrayItem)

// Gets the array item in a loop
for ll_Index = 1 to ll_ChildCount
 // Gets the array item
 Long ll_ObjectItem = lnv_JsonParser.GetChildItem(ll_ArrayItem, ll_Index)

 // Array item is JsonObjectItem!
 if lnv_JsonParser.GetItemType(ll_ObjectItem) = JsonObjectItem! then
  ll_Id = lnv_JsonParser.GetItemNumber(ll_ObjectItem, "id")
  ls_Name = lnv_JsonParser.GetItemString(ll_ObjectItem, "name")
  ldt_Birthday = lnv_JsonParser.GetItemDateTime(ll_ObjectItem, "birthday")
 end if
 ...
next

Example 7: This example determines the type of number values according to the item handle.

Long    ll_ItemCount, ll_I, ll_RootItem, ll_Child
String  ls_Json, ls_Return, ls_Key, ls_Value
Dec     ldc_Value
JsonItemType    ljs_type, ljs_Root
JsonNumberType  ljsn_type
JsonParser ljs_par

ljs_par = Create JsonParser

ls_Json = '{"value1":123.45,"value2":Infinity,"value3":-Infinity,"value4":NaN,"value5":null}'
ls_Return = ljs_par.LoadString(ls_Json)
If Len(ls_Return) > 0 Then Return
ll_RootItem = ljs_par.GetRootItem()
ll_ItemCount = ljs_Par.GetChildCount(ll_RootItem)
ljs_Root =  ljs_par.GetItemType(ll_RootItem)
For ll_I = 1 To ll_ItemCount
 ll_child = ljs_par.getchilditem( ll_RootItem, ll_i)
 ls_Key = ljs_par.GetChildKey(ll_RootItem, ll_i)
 ljs_type = ljs_par.GetItemType(ll_child)
 Choose Case ljs_type
  Case Jsonnumberitem!
   ldc_Value = ljs_par.GetItemNumber(ll_child)
   If IsNull ( ldc_value ) Then
    ljsn_type = ljs_par.GetNumberType(ll_child)
    Choose Case ljsn_type
     Case JsonNaN!
      ls_value = "Nan"
     Case JsonPositiveInfinity!
      ls_value = "Infinity"
     Case JsonNegativeInfinity!
      ls_value = "-Infinity"
     Case JsonNumber!
      ls_value = "null"
     Case Else
    End Choose
   Else
    ls_value = String(ldc_value)
   End If
  Case Jsonnullitem!
   ls_value = "null"
 End Choose
 ls_Return += ls_Key + "=" + ls_Value + "~r~n"
Next
If IsValid ( ljs_par ) Then Destroy ( ljs_par )

Example 8: The following code handles an irregular JSON string which contains a null value.

long ll_loop,i
long ll_row  
long ll_root,ll_object,ll_item  //receiving the handle of JSON item
string ls_json,ls_error
string ls_return
string ls_key  
jsonparser lnv_jsonparser

lnv_jsonparser = create jsonparser
ls_json = "[{~"ID~":101,~"FirstName~":~"Li~"},{~"ID~":102,~"FirstName~":null}]" // JSON data contains a null value
//Loads the JSON data
ls_error= lnv_jsonparser.loadstring(ls_json)
if len(trim(ls_error)) > 0 then
         messagebox("Failed","load json failed:"+ls_error)
         return
end if
//Obtains the handle of root item
ll_root = lnv_jsonparser.getrootitem()
//Obtains the data of each row
for ll_loop = 1 to lnv_jsonparser.getchildcount(ll_root)
         //Obtains the handle of each row
         ll_object = lnv_jsonparser.getchilditem(ll_root,ll_loop)
         //Inserts a row into datawindow
         ll_row = dw_1.insertrow(0)
         //Parses the item value one by one in a row in a loop
         for i = 1 to lnv_jsonparser.getchildcount(ll_object)
                   //Obtains the handle and key of each item
                   ll_item = lnv_jsonparser.getchilditem(ll_object,i)
                   ls_key = lnv_jsonparser.getchildkey(ll_object,i)
                   //Checks the data type of each item
                   choose case lnv_jsonparser.getitemtype(ll_item)
                            case jsonarrayitem!,jsonobjectitem!
                                     messagebox("Error","Not standard datatype") //Item value cannot be inserted to datawindow
                            case jsonnumberitem!
                                     //Obtains number data
                                     dw_1.setitem(ll_row,i,lnv_jsonparser.getitemnumber(ll_item))
                                     //dw_1.setitem(ll_row,ls_key,lnv_jsonparser.getitemnumber(ll_object,ls_key)) or set data by column name
                            case jsonstringitem!
                                     //Obtains string data
                                     dw_1.setitem(ll_row,i,lnv_jsonparser.getitemstring(ll_item))
                            case jsonbooleanitem!
                                     //Obtains boolean data. boolean converted to string and inserted to datawindow
                                     dw_1.setitem(ll_row,i,string(lnv_jsonparser.getitemboolean(ll_item)))
                            case jsonnullitem!
                                     //null value. Not inserted to datawindow.             
                   end choose
         next  //Finish parsing one row
next//Start parsing next row

See also

LoadFile