Uncaught Monkey Exception when creating jsonobject
Monkey Forums/Monkey Programming/Uncaught Monkey Exception when creating jsonobject
| ||
| Hi all, I'm checking out Monkey again and trying to do something I thought would be simple: I'm trying to consume JSON from a rest layer I built in another engine. I can get it, can see the JSON, and can copy and paste it into values and create a new JsonObject successfully. But what I cannot do is create a new JsonObject with the direct output from the rest layer. In other words, if I have a successful HTTPRequest and I put the JSON returned into a string "response", it blows up and gives me only "Uncaught Monkey Exception" on this line: Local jsonObj:= New JsonObject(HTTPreq.response) I've tried replacing newlines and returns (~n, ~r) in the string and cutting out some characters, with no luck. You can use this online sample for some returned JSON (not mine): http://echo.jsontest.com/key/value/one/two It errors in the same way as my own attempts. If I make a local string that contains the same return text as I've typed it, no problem. the object is created perfectly. I've added a custom content-json header to the writer in my rest layer, including enforcing UTF-8, but it hasn't made a difference. Anyone else have this issue? Thanks -Jesse |
| ||
| I use json all the time from HTTP req's and don't have any problems, try putting the req response into a string first and print it to the console to check it looks ok. also remove any extra spaces in the json string and try .Trim(). |
| ||
I tested the Url provided without any problems:
Import mojo
Import brl.json
Import brl.httprequest
Function Main()
New Game()
End
Class Game Extends App Implements IOnHttpRequestComplete
Method OnCreate()
SetUpdateRate(60)
Local httpReq:HttpRequest
httpReq = New HttpRequest("GET", "http://echo.jsontest.com/key/value/one/two", Self)
httpReq.Send()
End
Method OnHttpRequestComplete:Void(req:HttpRequest)
Print("Http Response :" + req.ResponseText)
Local jsonObj:JsonObject = New JsonObject(req.ResponseText)
Print(jsonObj.Get("one").StringValue())
Print(jsonObj.Get("key").StringValue())
End Method
Method OnUpdate()
UpdateAsyncEvents()
End
Method OnRender()
Cls()
End
End
|
| ||
| Thanks so much for the replies. The code above worked for me also, so I dug deeper, and found that where it fails to create the JsonObject is when it's outside of the OnHttpRequestComplete method. If I try to pass the response string as a member to logic in the Update or Render areas, it fails with the above error. Is that expected?
Strict
Import mojo
Import mojo.app
Import mojo.graphics
Import brl.httprequest
Import brl.json
Global HTTPreq:= New HTTPreqClass
Function Main:Int()
New MyApp
Return 0
End
Class MyApp Extends App
Method OnCreate:Int()
SetUpdateRate 60
HTTPreq.GetTxtFromWeb("http://echo.jsontest.com/key/value/one/two")
Return 0
End
Method OnUpdate:int()
If KeyHit( KEY_CLOSE ) Error ""
If HTTPreq <> Null
Local jsonObj:= New JsonObject(HTTPreq.response) ''This fails every time
EndIf
UpdateAsyncEvents
Return 0
End
Method OnRender:Int()
Cls (0,0,200)
DrawText(HTTPreq.response, 200, 200)
Return 0
End Method
End
Class HTTPreqClass Implements IOnHttpRequestComplete
Field get_req:HttpRequest, post_req:HttpRequest
Field jsonObj:JsonObject
Field response:String
Method OnHttpRequestComplete:Void(req:HttpRequest)
If req=get_req
Print "Http GET complete!"
Else
Print "Http POST complete!"
Endif
Print "Status=" + req.Status()
response = req.ResponseText()
jsonObj = New JsonObject(response) ''This works fine
End
Method GetTxtFromWeb:Void(path:String)
get_req = New HttpRequest( "GET", path, Self )
get_req.Send()
End
End
Thanks again. |
| ||
It fails because your logic check doesn't stop the response being used before it has actually returned:If HTTPreq <> Null HTTPreq is never Null as you create it on app construction. You probably want to use If HTTPreq.response <> "" or If HTTPreq.post_req <> Null Or set a flag yourself in the OnHttpRequestComplete method. |
| ||
| Ah makes sense... thanks again! Been too long since I got into coding again... |