Page 1 of 1

Problems with XPRIM_RandomAccessJsonReader

Posted: Wed May 07, 2025 2:23 am
by RH58
I am trying to retrieve values from a returned JSON using XPRIM_RandomAccessJsonReader.

I am very new to this and have been using the web page as a reference https://docs.lansa.com/14/en/lansa018/c ... 1_0085.htm

The JSON I receive is:

Code: Select all

{
	"name":"X0010GetNextNumber",
	"template":"D0000065",
	"submitted":true,
	"result":
	{
		"output":
		[
			{"id":1,"value":"01"},
			{"id":2,"value":1},
			{"id":3,"value":""},
			{"id":4,"value":""},
			{"id":5,"value":0},
			{"id":6,"value":0},
			{"id":7,"value":""},
			{"id":8,"value":60484}
		]
	}
}
I need to retrieve the value assigned to id 8 (60484 in this example).


The code I have created (using example from the above web page) is :

Code: Select all

#Reader.SetSourceHttpResponse HTTPRESPONSE(#Request.Response) ERRORINFO(#ErrorInfo)
IF (#ErrorInfo.OK.IsFalse)
  RETURN
ENDIF

BEGIN_LOOP USING(#JCount) TO(8)
  USE BUILTIN(numeric_string) WITH_ARGS(#JCount) TO_GET(#@Ch)
  
  CHANGE FIELD(#JSONPath) TO('''result/output/''')
  SUBSTRING FIELD(#@Ch 1 1) INTO_FIELD(#JSONPath 15 1)

  #Reader.BeginObjectWithPath( #JSONPath )
  #xIDn := #Reader.ReadnumberWithPath( '''id''' )

  IF (#xIDn = 8)
     #xjsonch := #Reader.ReadStringWithPath( '''value''' ).asNativeString
     #Reader.EndObject
     LEAVE
  ENDIF
  #Reader.EndObject

END_LOOP
The value for field #xIDN is not being set.

Any help to get this working will be greatly appreciated.

Re: Problems with XPRIM_RandomAccessJsonReader

Posted: Wed May 07, 2025 4:45 am
by Dino
Problem to use a loop is that values returned are a mix of numbers and strings....

Code: Select all

Define_Com Class( #XPRIM_RandomAccessJsonReader ) Name( #Reader ) Reference( *DEFERRED ) 
Define_Com Class(#XPRIM_ErrorInfo) Name(#ErrorObject) Reference(*DEFERRED) 

#STD_NVARC := #Reader.ReadStringWithName( "name" ).asNativeString 
#STD_NVARC := #Reader.ReadStringWithName( "template" ).asNativeString 
#STD_BOOL := #Reader.ReadBooleanWithName( "submitted" ) 

#Reader.BeginObjectWithName Name("result") Found(#Found) /* Begin Object 2 */ 
IF #Found 
#Reader.BeginArrayWithName Name("output") Found(#Found) /* Begin Array 1 */ 
IF #Found 
#Reader.BeginObjectAtIndex Index(1) Found(#Found) /* Begin Object 3 for index 1 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString #Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(2) Found(#Found) /* Begin Object 3 for index 2 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NUM := #Reader.ReadNumberWithName( "value" ) 
#Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(3) Found(#Found) /* Begin Object 3 for index 3 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString 
#Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(4) Found(#Found) /* Begin Object 3 for index 4 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString 
#Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(5) Found(#Found) /* Begin Object 3 for index 5 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NUM := #Reader.ReadNumberWithName( "value" ) 
#Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(6) Found(#Found) /* Begin Object 3 for index 6 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NUM := #Reader.ReadNumberWithName( "value" ) 
#Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(7) Found(#Found) /* Begin Object 3 for index 7 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NVARC := #Reader.ReadStringWithName( "value" ).asNativeString #Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.BeginObjectAtIndex Index(8) Found(#Found) /* Begin Object 3 for index 8 index in Array 1 */ 
IF #Found 
#STD_NUM := #Reader.ReadNumberWithName( "id" ) 
#STD_NUM := #Reader.ReadNumberWithName( "value" ) 
#Reader.EndObject /* End Object 3 */ 
ENDIF 

#Reader.EndArray /* End Array 1 */ 
ENDIF 

#Reader.EndObject /* End Object 2 */ 
ENDIF 

#Reader.EndObject /* End Object 1 */ 
ENDIF

Re: Problems with XPRIM_RandomAccessJsonReader

Posted: Wed May 07, 2025 6:34 pm
by RH58
Hi Dino,

Thank you for your reply. That has helped a lot. :)