Java: Send Date Object as JSONObject through Parse.com REST API
Solution 1
Your format doesn't match the one they've required. For example:
Theirs: 2011-08-21T18:02:52.249Z
Yours: 2011-08-21 18:02:52.249
You're missing the T
and the Z
.
So try changing your format to:
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
To be honest, I'd be surprised if this weren't handled automatically though - have you tried just dateAsObj.put("iso", sendTime)
?
Solution 2
Standard Date Object is not stored in Parse. You have to set it as a JSON Object with "__type": "Date"
and "iso": Date_String_you_want_to_set
.
with the date string formatted as below:
DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
Koolstr
Updated on June 13, 2022Comments
-
Koolstr almost 2 years
I am trying to create a new object in my Parse.com database through Parse's REST API, using an HttpsUrlConnection. Their REST API only accepts JSON. I have gotten everything to work, where the database would accept the new object entry - except for when I attempt to include a Date field. When I do pass in a Date, the server rejects the object entirely.
I found this in their documentation this description for how to add a Date field in an object when using the REST API:
The Parse mobile client libraries also support dates, binary data, and relational data. In the REST API, these values are encoded as JSON hashes with the __type field set to indicate their type, so you can read or write these fields if you use the correct encoding.
The Date type contains a field iso which contains a UTC timestamp stored in ISO 8601 format with millisecond precision: YYYY-MM-DDTHH:MM:SS.MMMZ.
{ "__type": "Date", "iso": "2011-08-21T18:02:52.249Z" }
So if I want to create a new object and pass it to the database, I am assuming I need to create another JSONObject and pass it over in its corresponding field. However, when I tried that, it still rejected it. Below is my attempt at adding the Date object as a parameter to pass over, stored in its own JSONObject. What am I doing wrong? What is the right way of sendign a Date object in JSON, based on their docs?
//datePicked is a Calendar object Date sendTime = datePicked.getTime(); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); String sendTimeInUTC = formatter.format(sendTime); //Storing the Date object as a JSONObject, as specified JSONObject dateAsObj = new JSONObject(); dateAsObj.put("__type", "Date"); dateAsObj.put("iso", sendTimeInUTC); //jsonParam is the JSONObject that is being sent over to Parse's REST API jsonParam.put("sendTime", dateAsObj);
Here is the full function which makes the http request, for context and reference:
private void runHttpRequest(final String emailAddress, final String password, String[] recipients, final String title, final String message) throws MalformedURLException { //Stores email in Parse DB, from Java servlet String url = "https://api.parse.com/1/classes/Email"; URL obj = new URL(url); HttpsURLConnection con = null; try { con = (HttpsURLConnection) obj.openConnection(); } catch (IOException e) { System.out.println("Failed to connect to http link"); e.printStackTrace(); } //add request header try { con.setRequestMethod("POST"); } catch (ProtocolException e) { System.out.println("Failed to set to POST"); e.printStackTrace(); } con.setRequestProperty("X-Parse-Application-Id", "*****************"); con.setRequestProperty("X-Parse-REST-API-Key", "*******************"); con.setRequestProperty("Content-Type", "application/json"); JSONObject jsonParam = new JSONObject(); jsonParam.put("username", "******"); jsonParam.put("emailID", 1); jsonParam.put("universalID", "******"); Gson converter = new Gson(); String recipientsInJson = converter.toJson(recipients); jsonParam.put("to", recipientsInJson); jsonParam.put("from", emailAddress); jsonParam.put("title", title); jsonParam.put("body", message); Date sendTime = datePicked.getTime(); //jsonParam.put("sendTime", sendTime); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); formatter.setTimeZone(TimeZone.getTimeZone("UTC")); String sendTimeInUTC = formatter.format(sendTime); System.out.println("UTC time" + sendTimeInUTC); JSONObject dateAsObj = new JSONObject(); dateAsObj.put("__type", "Date"); dateAsObj.put("iso", sendTimeInUTC); System.out.println(dateAsObj.toString()); jsonParam.put("sendTime", dateAsObj); String urlParameters = jsonParam.toString(); // Send POST request con.setDoOutput(true); DataOutputStream wr = null; try { wr = new DataOutputStream(con.getOutputStream()); } catch (IOException e1) { System.out.println("Failed to get output stream"); e1.printStackTrace(); } try { wr.writeBytes(urlParameters); } catch (IOException e) { System.out.println("Failed to connect to send over Parse object as parameter"); e.printStackTrace(); } try { wr.flush(); } catch (IOException e) { e.printStackTrace(); } try { wr.close(); } catch (IOException e) { System.out.println("Failed to connect to close datastream connection"); e.printStackTrace(); } int responseCode = 0; try { responseCode = con.getResponseCode(); } catch (IOException e) { System.out.println("Failed to connect to get response code"); e.printStackTrace(); } System.out.println("\nSending 'POST' request to URL : " + url); System.out.println("Post parameters : " + urlParameters); System.out.println("Response Code : " + responseCode); BufferedReader in = null; try { in = new BufferedReader( new InputStreamReader(con.getInputStream())); } catch (IOException e) { System.out.println("Failed to get input stream"); e.printStackTrace(); } String inputLine; StringBuffer response = new StringBuffer(); try { while ((inputLine = in.readLine()) != null) { response.append(inputLine); } } catch (IOException e) { System.out.println("Failed to read line"); e.printStackTrace(); } try { in.close(); } catch (IOException e) { System.out.println("Failed to close input stream"); e.printStackTrace(); } //print result System.out.println(response.toString()); }
Any help or input would be appreciated.
-
Koolstr over 9 yearsThat worked! You were correct, that was the only issue. Thank you for your help. I've tried just sending over the standard Date object but it was not converted automatically. I needed to manually format it before sending.