Play 2.4 and Json parsing issue

290 views
Skip to first unread message

rajv

unread,
Jul 4, 2015, 2:57:52 PM7/4/15
to play-fr...@googlegroups.com
Hi

i am trying to use play 2.4 to get json and parse it to create an object

here is the code snippet

package models

case class Product(id: Long, name: String)

package controllers

import models.Product
import play.api.libs.json.{JsError, Json}
import play.api.libs.json.Json._
import play.api.mvc._

object WSProducts extends Controller {
implicit private val productWrites = Json.writes[Product]
implicit private val productReads = Json.reads[Product]
private val products: scala.collection.mutable.ListBuffer[Product] = scala.collection.mutable.ListBuffer[Product]()

def create = Action(BodyParsers.parse.json) { implicit request =>
val post = request.body.validate[Product]
post.fold(
errors => BadRequest(Json.obj("message" -> JsError.toFlatJson(errors))),
p => {
try {
products += p
Created(Json.toJson(p))
} catch {
case e: Exception => InternalServerError(e.getMessage)
}
}
)
}
}
Routes 

POST        /api/products             controllers.WSProducts.create

When i post json using the following command

curl -v -X POST http://localhost:9000/api/products --data '{"sku":"abc",   "title":"Macbook Pro Retina"}' --header "Content-type: application/json"

i get the following error
debug] - play.api.mvc.BodyParsers - Invalid Json
om.fasterxml.jackson.core.JsonParseException: Unexpected character (''' (code 39)): expected a valid value (number, String, array, object, 'true', 'false' or
ull')
at [Source: [B@77d49797; line: 1, column: 2]
       at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1487) ~[jackson-core-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:518) ~[jackson-core-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:447) ~[jackson-core-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2485) ~[jackson-core-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:801) ~[jackson-core-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:697) ~[jackson-core-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3604) ~[jackson-databind-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:3522) ~[jackson-databind-2.5.4.jar:2.5.4]
       at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1872) ~[jackson-databind-2.5.4.jar:2.5.4]
       at play.api.libs.json.jackson.JacksonJson$.parseJsValue(JacksonJson.scala:223) ~[play-json_2.11-2.4.2.jar:2.4.2]
       at play.api.libs.json.Json$.parse(Json.scala:40) ~[play-json_2.11-2.4.2.jar:2.4.2]
       at play.api.mvc.BodyParsers$parse$$anonfun$tolerantJson$1.apply(ContentTypes.scala:379) ~[play_2.11-2.4.2.jar:2.4.2]
       at play.api.mvc.BodyParsers$parse$$anonfun$tolerantJson$1.apply(ContentTypes.scala:375) ~[play_2.11-2.4.2.jar:2.4.2]
       at play.api.mvc.BodyParsers$parse$$anonfun$tolerantBodyParser$1$$anonfun$6$$anonfun$apply$56.apply(ContentTypes.scala:759) ~[play_2.11-2.4.2.jar:2.4.2
       at scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:125) ~[scala-library-2.11.6.jar:na]
       at scala.util.control.Exception$Catch$$anonfun$either$1.apply(Exception.scala:125) ~[scala-library-2.11.6.jar:na]
       at scala.util.control.Exception$Catch.apply(Exception.scala:103) ~[scala-library-2.11.6.jar:na]
       at scala.util.control.Exception$Catch.either(Exception.scala:125) ~[scala-library-2.11.6.jar:na]
       at play.api.mvc.BodyParsers$parse$$anonfun$tolerantBodyParser$1$$anonfun$6.apply(ContentTypes.scala:758) [play_2.11-2.4.2.jar:2.4.2]
       at play.api.mvc.BodyParsers$parse$$anonfun$tolerantBodyParser$1$$anonfun$6.apply(ContentTypes.scala:757) [play_2.11-2.4.2.jar:2.4.2]
       at play.api.libs.iteratee.Iteratee$$anonfun$map$1.apply(Iteratee.scala:512) [play-iteratees_2.11-2.4.2.jar:2.4.2]
       at play.api.libs.iteratee.Iteratee$$anonfun$map$1.apply(Iteratee.scala:512) [play-iteratees_2.11-2.4.2.jar:2.4.2]
       at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:537) [play-iteratees_2.11-2.4.2.jar:2.4.2]
       at play.api.libs.iteratee.Iteratee$$anonfun$flatMap$1$$anonfun$apply$14.apply(Iteratee.scala:537) [play-iteratees_2.11-2.4.2.jar:2.4.2]
       at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) [scala-library-2.11.6.jar:na]
       at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) [scala-library-2.11.6.jar:na]
       at play.api.libs.iteratee.Execution$trampoline$.executeScheduled(Execution.scala:120) [play-iteratees_2.11-2.4.2.jar:2.4.2]
       at play.api.libs.iteratee.Execution$trampoline$.execute(Execution.scala:71) [play-iteratees_2.11-2.4.2.jar:2.4.2]
       at scala.concurrent.impl.CallbackRunnable.executeWithValue(Promise.scala:40) [scala-library-2.11.6.jar:na]
       at scala.concurrent.impl.Promise$DefaultPromise.tryComplete(Promise.scala:248) [scala-library-2.11.6.jar:na]
       at scala.concurrent.Promise$class.complete(Promise.scala:55) [scala-library-2.11.6.jar:na]
       at scala.concurrent.impl.Promise$DefaultPromise.complete(Promise.scala:153) [scala-library-2.11.6.jar:na]
       at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:23) [scala-library-2.11.6.jar:na]
       at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:40) [akka-actor_2.11-2.3.11.jar:na]
       at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397) [akka-actor_2.11-2.3.11.jar:na]
       at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) [scala-library-2.11.6.jar:na]
       at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) [scala-library-2.11.6.jar:na]
       at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) [scala-library-2.11.6.jar:na]
       at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) [scala-library-2.11.6.jar:na]
info] - application - 0:0:0:0:0:0:0:1 - [Sat Jul 04 14:56:39 EDT 2015] - POST /api/products 400 0.243

I am not sure what is the mistake i am making

Regards
Raj

rajv

unread,
Jul 4, 2015, 4:40:24 PM7/4/15
to play-fr...@googlegroups.com
I find this to be a problem only in windows not in linux.  May be it is a problem either with windows curl or json parser in windows

Regards
Raj

rajv

unread,
Jul 4, 2015, 4:53:14 PM7/4/15
to play-fr...@googlegroups.com
It was my mistake that i did not pay attention to the warning message in windows command prompt when i ran the curl command
curl: (3) [globbing] unmatched close brace/bracket at pos 25

The correct way to submit curl command in windows is http://localhost:9000/api/products

curl --include --request POST --header "Content-type: application/json" --data "{\"sku\":\"abc\",\"title\":\"Macbook Pro Retina\"}"
Reply all
Reply to author
Forward
0 new messages