× The internal search function is temporarily non-functional. The current search engine is no longer viable and we are researching alternatives.
As a stop gap measure, we are using Google's custom search engine service.
If you know of an easy to use, open source, search engine ... please contact support@midrange.com.



I think you're making it a lot harder than it needs to be using user
spaces.

Scott's answer using yajl_stdin_load_tree() would be the easiest as it has
an option to write the json to a file that you can reference in a log.
There's really no reason that I can think of to load all the JSON into a
variable. Let YAJL do it's job. :)

On Mon, Oct 19, 2020 at 12:02 PM Moses Nang (IMS Morton Grove) <
moses.nang@xxxxxxxxxxxxx> wrote:

Thank you for your reply, Scott. I must admit this is my first foray into
bringing data from the stdin and using yajl. Below is my code that I copied
from an existing program, that is working for us, to execute QtmhRdStin()
API and I see that the json data does get populated into p_UsrSpcData
(UsrSpcData).

When " docNode = yajl_buf_load_tree(%addr(p_UsrSpcData) : %len(len) :
yajl_error);" executes , the yajl_error variable contains:

'lexical error: invalid char in json text. '

Would you know what would be causing this error?

* Create User Space Parms
*
D QUSCRTUS PR ExtPgm('QUSCRTUS')
D usrspc 20a const
D attr 10a const
D size 10i 0 const
D initval 1a const
D pubauth 10a const
D text 50a const
D replace 10a const options(*nopass)
D ErrorCode 32767a options(*varsize: *nopass)
****************************************************************
* Change User Space Attributes
*
D QUSCUSAT PR ExtPgm('QUSCUSAT')
D RtnLib 10A
D UsrSpc 20A const
D Attrib 65535A const options(*varsize)
D ErrorCode 32767A options(*varsize)
****************************************************************
D KEY_AUTO_EXT C const(3)
D AutoExt DS qualified
D NbrRec 10I 0 inz(1)
D Key 10I 0 inz(KEY_AUTO_EXT)
D Len 10I 0 inz(%size(AutoExt.Data))
D Data 1A inz(*ON)
****************************************************************
* Delete User Space
*
D QUSDLTUS PR ExtPgm('QUSDLTUS')
D usrspc 20a const
D ErrorCode 32767a options(*varsize)
****************************************************************
* Retrieve Pointer to User Space
*
D QUSPTRUS PR ExtPgm('QUSPTRUS')
D usrspc 20a const
D pointer *
D ErrorCode 32767a options(*varsize:*nopass)

* Read StdIn
*
D QtmhRdStin PR extproc('QtmhRdStin')
D result * value
D resultsize 10i 0 const
D resultlen 10i 0
D ErrorCode 32767a options(*varsize)

D Kaboom ds qualified
D bytesProv 10i 0 inz(0)
D bytesAvail 10i 0 inz(0)

D Ignore ds qualified
D bytesProv 10i 0 inz(%size(Ignore))
D bytesAvail 10i 0 inz(0)

D MAXSPACE c const(16766704)
D USRSPC c 'JSONDATA QTEMP'
D rtnlib s 10a
D len s 10i 0
D p_UsrSpcData s *
D UsrSpcData s 3000A BASED(p_UsrSpcData)
// YAJL Variables
D docNode S like(yajl_val)
D node S like(yajl_val)
D val S like(yajl_val)
D yajl_error S 500A varying
D errMsg S 500A varying

// ------------------------------------------
// Delete user space (if it exists) with the
// QUSDLTUS API.
//
// Then create one, 512k to start with.
// Initialize user space with blanks.
// XML-INTO will choke on the x'00' character.
// ------------------------------------------

QUSDLTUS( USRSPC: Ignore );

QUSCRTUS( USRSPC
: 'JSON'
: 512 * 1024
: ' '
: '*EXCLUDE'
: 'User Space to Contain JSON'
: '*NO'
: Kaboom );

// ------------------------------------------
// Mark user space for auto-extension with
// the QUSCUSAT API. This way, if more than
// 512k is needed, the system will expand the
// user space automatically. (up to 16 MB)
//
// Then use QUSPTRUS to get a pointer to it.
// ------------------------------------------

// ------------------------------------------
// Mark user space for auto-extension with
// the QUSCUSAT API. This way, if more than
// 512k is needed, the system will expand the
// user space automatically. (up to 16 MB)
//
// Then use QUSPTRUS to get a pointer to it.
// ------------------------------------------

QUSCUSAT( RtnLib
: USRSPC
: 'JSON'
: 512 * 1024
: ' '
: '*EXCLUDE'
: 'User Space to Contain JSON'
: '*NO'
: Kaboom );

// ------------------------------------------
// Mark user space for auto-extension with
// the QUSCUSAT API. This way, if more than
// 512k is needed, the system will expand the
// user space automatically. (up to 16 MB)
//
// Then use QUSPTRUS to get a pointer to it.
// ------------------------------------------

QUSCUSAT( RtnLib
: USRSPC
: AutoExt
: Kaboom );

QUSPTRUS( USRSPC
: p_UsrSpcData );

// ------------------------------------------
// Read all of the data sent via STDIN
// into the user space.
// ------------------------------------------

QtmhRdStin( p_UsrSpcData
: MAXSPACE
: len
: Kaboom );

docNode = yajl_buf_load_tree(%addr(p_UsrSpcData): %len(len)
:yajl_error);

Moses Nang
Senior Programmer Analyst
O: 847.583.3712


Integrated Merchandising Solutions, LLC
8338 Austin Avenue, Morton Grove, IL 60053
imsretail.com

-----Original Message-----
From: MIDRANGE-L <midrange-l-bounces@xxxxxxxxxxxxxxxxxx> On Behalf Of
Scott Klement
Sent: Friday, October 16, 2020 11:08 AM
To: midrange-l@xxxxxxxxxxxxxxxxxx
Subject: Re: Saving Stdin to a variable using YAJL

Hello,

yajl_stdin_load_tree() provides an option that can be used to write it to
a file. This is one of the parmeters you pass to the procedure...

If you want to put it into a variable instead of a file, what you would do
is:

1) Read stdin yourself with the QtmhRdStin() API from IBM. Use this to
load it into a variable.

2) Write your variable to the log file.

3) Pass the variable to yajl_string_load_tree (or yajl_buf_load_tree if
that works better)

-SK


On 10/15/2020 5:56 PM, Moses Nang (IMS Morton Grove) wrote:
Prior to parsing the json data that is in the stdin using
yajl_stdin_load_tree, is there a way for me to move the complete json data
(i.e. name/value pairs, curly braces, square brackets, etc.) to one
variable before I parse the data into the child nodes. I eventually want to
save that "raw" json data to a field in log table.

Thanks,
Moses Nang

This email is intended only for the person or entity to which it is
addressed and may contain information that is privileged, confidential or
otherwise protected from disclosure. Dissemination, distribution, or
copying of this email or the information herein by anyone other than the
intended recipient, or an employee or agent responsible for delivering the
message to the intended recipient, is prohibited. If you have received this
email in error, please immediately notify us by calling our Network
Operations Center at +1 888 697 2443.
--
This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing
list To post a message email: MIDRANGE-L@xxxxxxxxxxxxxxxxxx To subscribe,
unsubscribe, or change list options,
visit:
https://urldefense.proofpoint.com/v2/url?u=https-3A__lists.midrange.com_mailman_listinfo_midrange-2Dl&d=DwIGaQ&c=HdAUNv_EOZyljLc1cjbHCq-Eo7r1kRHoywhQbi81uaA&r=plwzSnPr1sMa1fbV3MlyeM8kmnaHf_byXhkFw-499P8&m=EMsHU0KI_z0ju4ppFQMsIhGnLhf5jlr7v5aBM8UsIXs&s=Qgv_764NrSMzeuraN93vCVHJKT0g3IwlHXFFBQohoik&e=
or email: MIDRANGE-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives at
https://urldefense.proofpoint.com/v2/url?u=https-3A__archive.midrange.com_midrange-2Dl&d=DwIGaQ&c=HdAUNv_EOZyljLc1cjbHCq-Eo7r1kRHoywhQbi81uaA&r=plwzSnPr1sMa1fbV3MlyeM8kmnaHf_byXhkFw-499P8&m=EMsHU0KI_z0ju4ppFQMsIhGnLhf5jlr7v5aBM8UsIXs&s=WrczXUE9enGtVsVpbHfcc_4EVpPAuCpMjIprDgM1T4I&e=
.

Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link:
https://urldefense.proofpoint.com/v2/url?u=https-3A__amazon.midrange.com&d=DwIGaQ&c=HdAUNv_EOZyljLc1cjbHCq-Eo7r1kRHoywhQbi81uaA&r=plwzSnPr1sMa1fbV3MlyeM8kmnaHf_byXhkFw-499P8&m=EMsHU0KI_z0ju4ppFQMsIhGnLhf5jlr7v5aBM8UsIXs&s=xCap4OlL73fXA-ozsrjBlflvDIDxuZ25eAn4bue11wE&e=
--
This is the Midrange Systems Technical Discussion (MIDRANGE-L) mailing list
To post a message email: MIDRANGE-L@xxxxxxxxxxxxxxxxxx
To subscribe, unsubscribe, or change list options,
visit: https://lists.midrange.com/mailman/listinfo/midrange-l
or email: MIDRANGE-L-request@xxxxxxxxxxxxxxxxxx
Before posting, please take a moment to review the archives
at https://archive.midrange.com/midrange-l.

Please contact support@xxxxxxxxxxxxxxxxxxxx for any subscription related
questions.

Help support midrange.com by shopping at amazon.com with our affiliate
link: https://amazon.midrange.com


As an Amazon Associate we earn from qualifying purchases.

This thread ...

Replies:

Follow On AppleNews
Return to Archive home page | Return to MIDRANGE.COM home page

This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].

Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.