【问题标题】:how to escape \ in received json fields如何在收到的 json 字段中转义 \
【发布时间】:2019-04-03 05:47:34
【问题描述】:

我的应用程序在 Http 响应中收到 json

 {"result":"success","additional-info":"{\"external-profile\":{\"email\":\"test@test.com\",\"firstname\":\"ln\",\"lastname\":\"fn\",\"password\":\"somePassword\"}}"}

我写了一个reads 来将传入的消息转换成case class

implicit val externalProfileAPIReads:Reads[ExternalUserProfileAPI] = (
    (JsPath \ "external-profile").read[ExternalUserProfile]
    ).map((x:ExternalUserProfile)=>(ExternalUserProfileAPI.apply(x)))

但在我的单元测试中,当我尝试转换消息时,转换失败。

val message = (responseBody \ "additional-info").get.as[ExternalUserProfileAPI]

错误是

JsResultException(errors:List((/external-profile,List(JsonValidationError(List(error.path.missing),WrappedArray())))))
play.api.libs.json.JsResultException: JsResultException(errors:List((/external-profile,List(JsonValidationError(List(error.path.missing),WrappedArray())))))
    at play.api.libs.json.JsReadable.$anonfun$as$2(JsReadable.scala:25)

问题 1- 是否因为接收到的消息中的 json 字段中包含 \ 而导致转换失败?

问题 2- 在“被测方法”中,我没有在响应中明确添加 \s。我只是在发送响应时在case class 上调用toString()Json.toJson(externalProfileAPI).toString()。如果\ 是问题所在,我怎样才能不在发送的响应中发送它们或在客户端转义它们?

【问题讨论】:

    标签: json playframework-2.6


    【解决方案1】:

    问题1:转换失败是因为json字段在 收到的消息中有\

    是的,因为当前状态的字符串不是正确的 Json,你必须删除(转义)那些反斜杠。

    问题 2:如果 \ 是问题所在,我怎么能不将它们发送到 在客户端发送响应或转义它们?

    您是否偶然在发送端的 json 上调用了 JSON.stringify()?如果是这样,删除它会删除反斜杠。否则,您可以调用JSON.parse(YOUR_STRING) 来转义接收端的反斜杠。

    【讨论】:

    • 在发送方,我打电话给val result:Future[AuthenticatorResult] = silhouette.env.authenticatorService.embed(securityToken, Ok(Json.toJson(JsonResultSuccess(Json.toJson(externalProfileAPI).toString()))))。我不知道这是否添加了“\”。在接收端,我尝试了val responseBody:String = contentAsString(resultFuture); println(s"received result ${responseBody}"); val responsBodyAsJson = Json.parse(responseBody); println(s"received result as json${responsBodyAsJson}"); ` 但我仍然得到“\”
    • 我刚刚意识到您实际上在 JSON 中有一个“字符串化”的 JSON,在这种情况下,简单地使用 JSON.parse 将无济于事。您是否必须将 Json 嵌套在里面,如果您不这样做可能会更容易,但是如果您必须将它嵌套在那里,请提取该 Json 子元素并在其上调用 JSON.parse 应该可以工作。
    • 谢谢。所以val responseBody = contentAsJson(resultFuture) //responseBody has backslashes 然后val message:String = (responseBody \ "additional-info").get.as[String] //removes the backslashes 最后val userProfile = Json.parse(message)
    • 很高兴能为您提供帮助,如果我的回答对您有所帮助,请考虑投票。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2011-09-17
    • 2015-01-02
    • 1970-01-01
    相关资源
    最近更新 更多