{"action":"created","comment":{"url":"https://api.github.com/repos/playframework/playframework/pulls/comments/77845117","id":77845117,"diff_hunk":"@@ -434,3 +427,13 @@ trait DefaultWrites {\n     }\n   }\n }\n+\n+sealed trait LowPriorityWrites {\n+  /**\n+   * Serializer for Traversables types.\n+   */\n+  implicit def traversableWrites[A: Writes] = Writes[Traversable[A]] { as =>","path":"framework/src/play-json/src/main/scala/play/api/libs/json/Writes.scala","position":32,"original_position":32,"commit_id":"f6aa5b15257202829f092e2aca5d1088920152ca","original_commit_id":"f6aa5b15257202829f092e2aca5d1088920152ca","user":{"login":"cchantep","id":166062,"avatar_url":"https://avatars.githubusercontent.com/u/166062?v=3","gravatar_id":"","url":"https://api.github.com/users/cchantep","html_url":"https://github.com/cchantep","followers_url":"https://api.github.com/users/cchantep/followers","following_url":"https://api.github.com/users/cchantep/following{/other_user}","gists_url":"https://api.github.com/users/cchantep/gists{/gist_id}","starred_url":"https://api.github.com/users/cchantep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cchantep/subscriptions","organizations_url":"https://api.github.com/users/cchantep/orgs","repos_url":"https://api.github.com/users/cchantep/repos","events_url":"https://api.github.com/users/cchantep/events{/privacy}","received_events_url":"https://api.github.com/users/cchantep/received_events","type":"User","site_admin":false},"body":"Fix ambiguous implicit, previously hidden by `OWrites.map` considered as a special case (which also prevented to have a custom implicit for such `Map`)","created_at":"2016-09-07T15:25:34Z","updated_at":"2016-09-07T15:25:34Z","html_url":"https://github.com/playframework/playframework/pull/5261#discussion_r77845117","pull_request_url":"https://api.github.com/repos/playframework/playframework/pulls/5261","_links":{"self":{"href":"https://api.github.com/repos/playframework/playframework/pulls/comments/77845117"},"html":{"href":"https://github.com/playframework/playframework/pull/5261#discussion_r77845117"},"pull_request":{"href":"https://api.github.com/repos/playframework/playframework/pulls/5261"}}},"pull_request":{"url":"https://api.github.com/repos/playframework/playframework/pulls/5261","id":84167450,"html_url":"https://github.com/playframework/playframework/pull/5261","diff_url":"https://github.com/playframework/playframework/pull/5261.diff","patch_url":"https://github.com/playframework/playframework/pull/5261.patch","issue_url":"https://api.github.com/repos/playframework/playframework/issues/5261","number":5261,"state":"open","locked":false,"title":"Limited support for recursive types within Json macro (reads/writes/format)","user":{"login":"cchantep","id":166062,"avatar_url":"https://avatars.githubusercontent.com/u/166062?v=3","gravatar_id":"","url":"https://api.github.com/users/cchantep","html_url":"https://github.com/cchantep","followers_url":"https://api.github.com/users/cchantep/followers","following_url":"https://api.github.com/users/cchantep/following{/other_user}","gists_url":"https://api.github.com/users/cchantep/gists{/gist_id}","starred_url":"https://api.github.com/users/cchantep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cchantep/subscriptions","organizations_url":"https://api.github.com/users/cchantep/orgs","repos_url":"https://api.github.com/users/cchantep/repos","events_url":"https://api.github.com/users/cchantep/events{/privacy}","received_events_url":"https://api.github.com/users/cchantep/received_events","type":"User","site_admin":false},"body":"I've come up with a partial solution to making the JSON macro more robust when handling recursive types. Rather than making a pull request, I wanted to discuss my findings here first, because I don't know how well they will be received.\r\n\r\nSuppose we have: \r\n```\r\ncase class Foo(id: Long, value: Either[String, Foo])\r\n```\r\nand some:\r\n```\r\nimplicit def eitherReads[A : Reads, B : Reads]: Reads[Either[A, B]] = ???\r\n```\r\nThe following macro call will fail from a type-mismatch error:\r\n```\r\nimplicit val reads = Json.reads[Foo]\r\n```\r\nAfter some digging, I found that if the macro determines that the structure is recursive (and not using a nullable call), it will eventually land [here](https://github.com/playframework/playframework/blob/f7e17a7880972b2e6a955e71a7035ae0f7903681/framework/src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala#L192-L200). This means that even if the [implicit found earlier in the macro](https://github.com/playframework/playframework/blob/f7e17a7880972b2e6a955e71a7035ae0f7903681/framework/src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala#L151) has type `Reads[Either[String, Foo]]`, the macro will insert the recursive call of type `Reads[Foo]` in the [`else` branch](https://github.com/playframework/playframework/blob/f7e17a7880972b2e6a955e71a7035ae0f7903681/framework/src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala#L200).\r\n\r\nOne idea I had was inspecting the implicit tree that was resolved, and carefully splicing in the call to `this.lazyStuff`. I see only a few possibilities for the structure of the implicit tree:\r\n\r\n1.  An implicit method that likely has it's own implicit parameters, to handle generics. Such as `Reads.seq`, or the above `eitherReads`, etc.\r\n2.  An implicit that can be typechecked to `N[A]` (an exact recursive call to the ident the macro result will be assigned to).\r\n3.  Some other static tree, such as an implicit val, or object, which requires no recursion and can be left alone.\r\n\r\nSo I wrote a method to handle these cases:\r\n```\r\ndef recursiveReplace(impl: Tree): List[Tree] = impl match {\r\n  case q\"$obj.$impldef[..$tparams](..$implparams)\" => {\r\n    val replaced = implparams.map(p => recursiveReplace(p))\r\n    q\"$obj.$impldef[..$tparams](..$replaced)\"\r\n  }\r\n  case obj if (c.typecheck(obj).tpe <:< natag.tpe) => q\"this.lazyStuff\"\r\n  case tree => tree\r\n}\r\n```\r\nThis will inspect a implicitly resolved tree and attempt to more carefully splice in the recursive calls. If the tree is a (1), it will extract the parameter trees and process them recursively with `recursiveReplace`. If it is a (2), it is replaced with the recursive call to the macro result `q\"this.lazyStuff\"`. If it is a (3) (for the moment), the tree is left alone.\r\n\r\nI wrote a few tests for `Either` and replaced [this call](https://github.com/playframework/playframework/blob/f7e17a7880972b2e6a955e71a7035ae0f7903681/framework/src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala#L200) with a call to `recursiveReplace(impl)`. Theoretically, `recursiveReplace` should also work for the manually handled `Set`, `List`, `Map` and `Seq` helpers, so I tried removing them and the tests failed (rather, didn't compile). It was then I realized the fix wouldn't work without a type annotation on the macro result, and why the aforementioned types are being handled specially.\r\n\r\nOne [already existing test](https://github.com/playframework/playframework/blob/f7e17a7880972b2e6a955e71a7035ae0f7903681/framework/src/play-json/src/test/scala/play/api/libs/json/JsonExtensionSpec.scala#L416-L426) for example contains:\r\n```\r\nimplicit val userReads = Json.reads[UserMap]\r\n```\r\n\r\nWhere `UserMap` is: `case class UserMap(name: String, friends: Map[String, UserMap] = Map())`\r\n\r\nIt _would_ work with my patch if the test actually read: \r\n```\r\nimplicit val userReads: Reads[UserMap] = Json.reads[UserMap]\r\n```\r\nThe problem lies in the implicit resolution. The type checker fails to find the implicit `Reads[Map[...]]` because it can't find the `Reads[UserMap]` that it depends on, because there is no type annotation:\r\n```\r\n/playframework/framework/src/play-json/src/test/scala/play/api/libs/json/JsonExtensionSpec.scala:465: json.this.Reads.mapReads is not a valid implicit value for play.api.libs.json.Reads[Map[String,play.api.libs.json.UserMap]] because:\r\n[info] hasMatchingSymbol reported error: No Json deserializer found for type play.api.libs.json.UserMap. Try to implement an implicit Reads or Format for this type.\r\n[info]       implicit val userReads = Json.reads[UserMap]\r\n```\r\nSo the \"needed implicit\" is actually an empty tree.\r\n\r\nIt seems like the macro can be much more powerful than it currently is, to support any kind of recursive type (well, maybe not any, but many more). The obvious problem with the above solution is that it introduces a breaking change where client code must annotate `Reads`, `Writes` and `Format` generated by the macro (at least in the recursive case).\r\n\r\nHowever:\r\n* It is very rigid to only support `Set`, `List`, `Map` and `Seq`, and `Option` within recursive types, and adding more would make the code far more ugly.\r\n* Isn't it good practice to explicitly annotate implicit result types anyway?\r\n* Many user-defined recursive types are not supported by the macro because of this.\r\n\r\nOr is needing to annotate the macro result unacceptable?","created_at":"2016-09-06T17:57:02Z","updated_at":"2016-09-07T15:25:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"17c71fa823e1792f9a7f100fbfe458904ff38a60","assignee":{"login":"wsargent","id":71236,"avatar_url":"https://avatars.githubusercontent.com/u/71236?v=3","gravatar_id":"","url":"https://api.github.com/users/wsargent","html_url":"https://github.com/wsargent","followers_url":"https://api.github.com/users/wsargent/followers","following_url":"https://api.github.com/users/wsargent/following{/other_user}","gists_url":"https://api.github.com/users/wsargent/gists{/gist_id}","starred_url":"https://api.github.com/users/wsargent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wsargent/subscriptions","organizations_url":"https://api.github.com/users/wsargent/orgs","repos_url":"https://api.github.com/users/wsargent/repos","events_url":"https://api.github.com/users/wsargent/events{/privacy}","received_events_url":"https://api.github.com/users/wsargent/received_events","type":"User","site_admin":false},"assignees":[{"login":"wsargent","id":71236,"avatar_url":"https://avatars.githubusercontent.com/u/71236?v=3","gravatar_id":"","url":"https://api.github.com/users/wsargent","html_url":"https://github.com/wsargent","followers_url":"https://api.github.com/users/wsargent/followers","following_url":"https://api.github.com/users/wsargent/following{/other_user}","gists_url":"https://api.github.com/users/wsargent/gists{/gist_id}","starred_url":"https://api.github.com/users/wsargent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/wsargent/subscriptions","organizations_url":"https://api.github.com/users/wsargent/orgs","repos_url":"https://api.github.com/users/wsargent/repos","events_url":"https://api.github.com/users/wsargent/events{/privacy}","received_events_url":"https://api.github.com/users/wsargent/received_events","type":"User","site_admin":false},{"login":"gmethvin","id":171663,"avatar_url":"https://avatars.githubusercontent.com/u/171663?v=3","gravatar_id":"","url":"https://api.github.com/users/gmethvin","html_url":"https://github.com/gmethvin","followers_url":"https://api.github.com/users/gmethvin/followers","following_url":"https://api.github.com/users/gmethvin/following{/other_user}","gists_url":"https://api.github.com/users/gmethvin/gists{/gist_id}","starred_url":"https://api.github.com/users/gmethvin/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gmethvin/subscriptions","organizations_url":"https://api.github.com/users/gmethvin/orgs","repos_url":"https://api.github.com/users/gmethvin/repos","events_url":"https://api.github.com/users/gmethvin/events{/privacy}","received_events_url":"https://api.github.com/users/gmethvin/received_events","type":"User","site_admin":false},{"login":"schmitch","id":1641401,"avatar_url":"https://avatars.githubusercontent.com/u/1641401?v=3","gravatar_id":"","url":"https://api.github.com/users/schmitch","html_url":"https://github.com/schmitch","followers_url":"https://api.github.com/users/schmitch/followers","following_url":"https://api.github.com/users/schmitch/following{/other_user}","gists_url":"https://api.github.com/users/schmitch/gists{/gist_id}","starred_url":"https://api.github.com/users/schmitch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/schmitch/subscriptions","organizations_url":"https://api.github.com/users/schmitch/orgs","repos_url":"https://api.github.com/users/schmitch/repos","events_url":"https://api.github.com/users/schmitch/events{/privacy}","received_events_url":"https://api.github.com/users/schmitch/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/playframework/playframework/pulls/5261/commits","review_comments_url":"https://api.github.com/repos/playframework/playframework/pulls/5261/comments","review_comment_url":"https://api.github.com/repos/playframework/playframework/pulls/comments{/number}","comments_url":"https://api.github.com/repos/playframework/playframework/issues/5261/comments","statuses_url":"https://api.github.com/repos/playframework/playframework/statuses/f6aa5b15257202829f092e2aca5d1088920152ca","head":{"label":"cchantep:feature/5261","ref":"feature/5261","sha":"f6aa5b15257202829f092e2aca5d1088920152ca","user":{"login":"cchantep","id":166062,"avatar_url":"https://avatars.githubusercontent.com/u/166062?v=3","gravatar_id":"","url":"https://api.github.com/users/cchantep","html_url":"https://github.com/cchantep","followers_url":"https://api.github.com/users/cchantep/followers","following_url":"https://api.github.com/users/cchantep/following{/other_user}","gists_url":"https://api.github.com/users/cchantep/gists{/gist_id}","starred_url":"https://api.github.com/users/cchantep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cchantep/subscriptions","organizations_url":"https://api.github.com/users/cchantep/orgs","repos_url":"https://api.github.com/users/cchantep/repos","events_url":"https://api.github.com/users/cchantep/events{/privacy}","received_events_url":"https://api.github.com/users/cchantep/received_events","type":"User","site_admin":false},"repo":{"id":14169038,"name":"playframework","full_name":"cchantep/playframework","owner":{"login":"cchantep","id":166062,"avatar_url":"https://avatars.githubusercontent.com/u/166062?v=3","gravatar_id":"","url":"https://api.github.com/users/cchantep","html_url":"https://github.com/cchantep","followers_url":"https://api.github.com/users/cchantep/followers","following_url":"https://api.github.com/users/cchantep/following{/other_user}","gists_url":"https://api.github.com/users/cchantep/gists{/gist_id}","starred_url":"https://api.github.com/users/cchantep/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cchantep/subscriptions","organizations_url":"https://api.github.com/users/cchantep/orgs","repos_url":"https://api.github.com/users/cchantep/repos","events_url":"https://api.github.com/users/cchantep/events{/privacy}","received_events_url":"https://api.github.com/users/cchantep/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cchantep/playframework","description":"Play Framework","fork":true,"url":"https://api.github.com/repos/cchantep/playframework","forks_url":"https://api.github.com/repos/cchantep/playframework/forks","keys_url":"https://api.github.com/repos/cchantep/playframework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cchantep/playframework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cchantep/playframework/teams","hooks_url":"https://api.github.com/repos/cchantep/playframework/hooks","issue_events_url":"https://api.github.com/repos/cchantep/playframework/issues/events{/number}","events_url":"https://api.github.com/repos/cchantep/playframework/events","assignees_url":"https://api.github.com/repos/cchantep/playframework/assignees{/user}","branches_url":"https://api.github.com/repos/cchantep/playframework/branches{/branch}","tags_url":"https://api.github.com/repos/cchantep/playframework/tags","blobs_url":"https://api.github.com/repos/cchantep/playframework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cchantep/playframework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cchantep/playframework/git/refs{/sha}","trees_url":"https://api.github.com/repos/cchantep/playframework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cchantep/playframework/statuses/{sha}","languages_url":"https://api.github.com/repos/cchantep/playframework/languages","stargazers_url":"https://api.github.com/repos/cchantep/playframework/stargazers","contributors_url":"https://api.github.com/repos/cchantep/playframework/contributors","subscribers_url":"https://api.github.com/repos/cchantep/playframework/subscribers","subscription_url":"https://api.github.com/repos/cchantep/playframework/subscription","commits_url":"https://api.github.com/repos/cchantep/playframework/commits{/sha}","git_commits_url":"https://api.github.com/repos/cchantep/playframework/git/commits{/sha}","comments_url":"https://api.github.com/repos/cchantep/playframework/comments{/number}","issue_comment_url":"https://api.github.com/repos/cchantep/playframework/issues/comments{/number}","contents_url":"https://api.github.com/repos/cchantep/playframework/contents/{+path}","compare_url":"https://api.github.com/repos/cchantep/playframework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cchantep/playframework/merges","archive_url":"https://api.github.com/repos/cchantep/playframework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cchantep/playframework/downloads","issues_url":"https://api.github.com/repos/cchantep/playframework/issues{/number}","pulls_url":"https://api.github.com/repos/cchantep/playframework/pulls{/number}","milestones_url":"https://api.github.com/repos/cchantep/playframework/milestones{/number}","notifications_url":"https://api.github.com/repos/cchantep/playframework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cchantep/playframework/labels{/name}","releases_url":"https://api.github.com/repos/cchantep/playframework/releases{/id}","deployments_url":"https://api.github.com/repos/cchantep/playframework/deployments","created_at":"2013-11-06T10:07:35Z","updated_at":"2014-06-25T02:02:56Z","pushed_at":"2016-09-07T15:15:17Z","git_url":"git://github.com/cchantep/playframework.git","ssh_url":"git@github.com:cchantep/playframework.git","clone_url":"https://github.com/cchantep/playframework.git","svn_url":"https://github.com/cchantep/playframework","homepage":"http://www.playframework.com/","size":81975,"stargazers_count":0,"watchers_count":0,"language":"Scala","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"playframework:master","ref":"master","sha":"cbc920db9b90fe5edcb1936579c69a4b135c23e6","user":{"login":"playframework","id":319107,"avatar_url":"https://avatars.githubusercontent.com/u/319107?v=3","gravatar_id":"","url":"https://api.github.com/users/playframework","html_url":"https://github.com/playframework","followers_url":"https://api.github.com/users/playframework/followers","following_url":"https://api.github.com/users/playframework/following{/other_user}","gists_url":"https://api.github.com/users/playframework/gists{/gist_id}","starred_url":"https://api.github.com/users/playframework/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/playframework/subscriptions","organizations_url":"https://api.github.com/users/playframework/orgs","repos_url":"https://api.github.com/users/playframework/repos","events_url":"https://api.github.com/users/playframework/events{/privacy}","received_events_url":"https://api.github.com/users/playframework/received_events","type":"Organization","site_admin":false},"repo":{"id":2340549,"name":"playframework","full_name":"playframework/playframework","owner":{"login":"playframework","id":319107,"avatar_url":"https://avatars.githubusercontent.com/u/319107?v=3","gravatar_id":"","url":"https://api.github.com/users/playframework","html_url":"https://github.com/playframework","followers_url":"https://api.github.com/users/playframework/followers","following_url":"https://api.github.com/users/playframework/following{/other_user}","gists_url":"https://api.github.com/users/playframework/gists{/gist_id}","starred_url":"https://api.github.com/users/playframework/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/playframework/subscriptions","organizations_url":"https://api.github.com/users/playframework/orgs","repos_url":"https://api.github.com/users/playframework/repos","events_url":"https://api.github.com/users/playframework/events{/privacy}","received_events_url":"https://api.github.com/users/playframework/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/playframework/playframework","description":"Play Framework","fork":false,"url":"https://api.github.com/repos/playframework/playframework","forks_url":"https://api.github.com/repos/playframework/playframework/forks","keys_url":"https://api.github.com/repos/playframework/playframework/keys{/key_id}","collaborators_url":"https://api.github.com/repos/playframework/playframework/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/playframework/playframework/teams","hooks_url":"https://api.github.com/repos/playframework/playframework/hooks","issue_events_url":"https://api.github.com/repos/playframework/playframework/issues/events{/number}","events_url":"https://api.github.com/repos/playframework/playframework/events","assignees_url":"https://api.github.com/repos/playframework/playframework/assignees{/user}","branches_url":"https://api.github.com/repos/playframework/playframework/branches{/branch}","tags_url":"https://api.github.com/repos/playframework/playframework/tags","blobs_url":"https://api.github.com/repos/playframework/playframework/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/playframework/playframework/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/playframework/playframework/git/refs{/sha}","trees_url":"https://api.github.com/repos/playframework/playframework/git/trees{/sha}","statuses_url":"https://api.github.com/repos/playframework/playframework/statuses/{sha}","languages_url":"https://api.github.com/repos/playframework/playframework/languages","stargazers_url":"https://api.github.com/repos/playframework/playframework/stargazers","contributors_url":"https://api.github.com/repos/playframework/playframework/contributors","subscribers_url":"https://api.github.com/repos/playframework/playframework/subscribers","subscription_url":"https://api.github.com/repos/playframework/playframework/subscription","commits_url":"https://api.github.com/repos/playframework/playframework/commits{/sha}","git_commits_url":"https://api.github.com/repos/playframework/playframework/git/commits{/sha}","comments_url":"https://api.github.com/repos/playframework/playframework/comments{/number}","issue_comment_url":"https://api.github.com/repos/playframework/playframework/issues/comments{/number}","contents_url":"https://api.github.com/repos/playframework/playframework/contents/{+path}","compare_url":"https://api.github.com/repos/playframework/playframework/compare/{base}...{head}","merges_url":"https://api.github.com/repos/playframework/playframework/merges","archive_url":"https://api.github.com/repos/playframework/playframework/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/playframework/playframework/downloads","issues_url":"https://api.github.com/repos/playframework/playframework/issues{/number}","pulls_url":"https://api.github.com/repos/playframework/playframework/pulls{/number}","milestones_url":"https://api.github.com/repos/playframework/playframework/milestones{/number}","notifications_url":"https://api.github.com/repos/playframework/playframework/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/playframework/playframework/labels{/name}","releases_url":"https://api.github.com/repos/playframework/playframework/releases{/id}","deployments_url":"https://api.github.com/repos/playframework/playframework/deployments","created_at":"2011-09-07T09:24:08Z","updated_at":"2016-09-07T10:53:29Z","pushed_at":"2016-09-07T15:15:19Z","git_url":"git://github.com/playframework/playframework.git","ssh_url":"git@github.com:playframework/playframework.git","clone_url":"https://github.com/playframework/playframework.git","svn_url":"https://github.com/playframework/playframework","homepage":"http://www.playframework.com/","size":95545,"stargazers_count":8350,"watchers_count":8350,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2883,"mirror_url":null,"open_issues_count":282,"forks":2883,"open_issues":282,"watchers":8350,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/playframework/playframework/pulls/5261"},"html":{"href":"https://github.com/playframework/playframework/pull/5261"},"issue":{"href":"https://api.github.com/repos/playframework/playframework/issues/5261"},"comments":{"href":"https://api.github.com/repos/playframework/playframework/issues/5261/comments"},"review_comments":{"href":"https://api.github.com/repos/playframework/playframework/pulls/5261/comments"},"review_comment":{"href":"https://api.github.com/repos/playframework/playframework/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/playframework/playframework/pulls/5261/commits"},"statuses":{"href":"https://api.github.com/repos/playframework/playframework/statuses/f6aa5b15257202829f092e2aca5d1088920152ca"}}}}
{"actor":{"display_login":"cchantep"}}