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... |