Http Response Parsing JSON string or stream
Hello community,
I am trying to parse the below HttpResponse in Cache. Cannot get the Iterator to work. Is there a single loop which can parse both or single messages and grab the error?
{
error:[
{ txt1:'error msg1'},
{ txt2:'error msg2'},
]
}
{
error: {
txt1:[
'error msg1',
'error msg2'
]
}
Thanks,
Jimmy Christian
What version are you on?
If it's 2016.2+ you can use dynamic objects.
Cache for Windows (x86-64) 2018.1.1 (Build 312_1_18937U) Fri Apr 26 2019 17:58:36 EDT
I tried dynamic objects but gives me an error, unless i am not doing it correctly or if syntax is not correct.
Set json =""
While ('objStream.AtEnd) {
Set json = json _ objStream.ReadLine()
}
while iter.%GetNext(.key , .value )
{
write "key = "_key_" , value = "_value,!
}
Well, the JSON you posted is not a valid JSON. Where did you get it?
Valid JSON looks like this:
{ "error":[ { "txt1":"error msg1" }, { "txt2":"error msg2" } ] }
You can simplify your code to this:
set dynObj = {}.%FromJSON(objHttpResponse.Data) set iter = dynObj.%GetIterator() while iter.%GetNext(.key , .value ) { write "key = "_key_" , value = "_value,! }
Also json is a string so in your code sample it won't have %FromJSON method.
Thank you Eduard.
So the message i posted is a response to an API call i make with JSON payload.
So i was assuming that the response would be JSON and i can try to parse it.
But if it is not a JSON, is there a utility to parse it or i need to use the provided STRING functions like ZSTRIP and so on?
Thanks,
Jimmy christian.
Can you make the same call to the API using Postman and show the response?
It's very strange that API returns non-json response.
Does my code snippet throw the same error?
The issue is the API is not set up yet on the project which i am working.
But the specs has the JSON PAYLOAD as request and then the response is what i pasted above.
So i am trying to get the code ready to parse in the meantime until the API is set up. Hopefully i will have something to work with POSTMAN as soon as API is set up.
Once i receive the response , i need to parse it for any error and then shutdown the operation. At the most i can convert the response to string and check for error.
Well, maybe it's a handwritten response?
I'd recommend contacting the API developer and verifying that API responses would be indeed JSON.
Thank you. Yes, i am going to find out in a day or two.
Appreciate your help and time.
JSONStreamToObect should do it.
If you can just paste the exact json, I can write it for you. No biggy
You can use this site to verify if json is correct
http://jsonviewer.stack.hu/
Thank you Neerav.
The message i pasted doesnt look like JSON.
Looks like i may have to use some STRING functions to parse it.
I will let you know once i get the right specs of the response. Thank you for time.
Regards,
Jimmy Christian.
No, it is JSON . Just one simple missing bracket. Here is the correct json for the same
{
error:[
{ txt1:'error msg1'},
{ txt2:'error msg2'},
],
error2:[
{ txt1:'error msg1'},
{ txt2:'error msg2'},
]
}
How is it valid JSON?
1. JSON accepts only double quotes. Single quotes are not valid.
2. Property names must be quoted (in double quotes). error/txt are not quoted.
Here's JSON standard.
Json parsers are parsing it.
However I haven't tried to run it by code to see if it works.
Yes, this works if you have one level. But what about if you have second level-something like this:
{
"statuses": [
"SW7=ON, SW6=OFF, SW5=OFF, SW4=OFF, SW3=OFF, SW2=OFF, SW1=OFF",
"Unique Printer ID and Fiscal Memory ID are set",
"The fiscal memory is formatted"
],
"warnings": [],
"errors": [],
"ok": true
}
Check this post to see how you can access all levels of dynamic object.