在scala中使用JsonPath从json字符串获取特定参数

在scala中使用JsonPath从json字符串获取特定参数,scala,jsonpath,Scala,Jsonpath,我有一个json字符串,我想在scala中使用JsonPath从这个json中提取一个参数。 给定Json: { "message_payload":"6b700b000006", "message_encryption_version":"2.0", "message_version":"1.0", "message_metadata":{ "marketplace_id":"1", "workflow_id":"5906bd4e

我有一个json字符串,我想在scala中使用JsonPath从这个json中提取一个参数。 给定Json:

{
    "message_payload":"6b700b000006",
    "message_encryption_version":"2.0",
    "message_version":"1.0",
    "message_metadata":{
        "marketplace_id":"1",
        "workflow_id":"5906bd4e-52eb-4e2d-9a16-034fb67572f1",
        "hostname":"dev-dsk-shivabo-2b-3c0a1bd6.us-west-2.amazon.com",
        "event_type":"MerchantRegistrationFraudEvaluation",
        "event_date":"1513665186657"
        }
}
我尝试使用下面的代码获取参数event_type,如某些示例中所示,但它抛出了一个错误:

val eventType = JsonPath.read(jsonString, "$.message_metadata.event_type")
错误:

error: ambiguous reference to overloaded definition,
[scalac-2.11] both method read in object JsonPath of type [T](x$1: String, x$2: String, x$3: com.jayway.jsonpath.Predicate*)T
[scalac-2.11] and  method read in object JsonPath of type [T](x$1: Any, x$2: String, x$3: com.jayway.jsonpath.Predicate*)T
[scalac-2.11] match argument types (String,String)
[scalac-2.11]     val eventType = JsonPath.read(jsonString, "$.message_metadata.event_type");

有人能告诉我这里缺少什么吗?

您需要给Scala编译器一个提示,以便它能够选择正确的方法:

val eventType = JsonPath.read[String](jsonString, "$.message_metadata.event_type")
以下是完整的测试应用程序:

import com.jayway.jsonpath.JsonPath

object TestApp extends App {
  val jsonString =
    """{
      |    "message_payload":"6b700b000006",
      |    "message_encryption_version":"2.0",
      |    "message_version":"1.0",
      |    "message_metadata":{
      |        "marketplace_id":"1",
      |        "workflow_id":"5906bd4e-52eb-4e2d-9a16-034fb67572f1",
      |        "hostname":"dev-dsk-shivabo-2b-3c0a1bd6.us-west-2.amazon.com",
      |        "event_type":"MerchantRegistrationFraudEvaluation",
      |        "event_date":"1513665186657"
      |        }
      |}""".stripMargin


  val eventType = JsonPath.read[String](jsonString, "$.message_metadata.event_type")
  println(eventType)  // MerchantRegistrationFraudEvaluation
}

我尝试了上面的解决方案,现在得到了一个不同的异常:com.jayway.jsonpath.PathNotFoundException:应该在path$['message\u metadata']中找到一个属性为['event\u type']的对象,但找到了'java.lang.String'。根据JsonProvider的说法,这不是一个json对象:“com.jayway.jsonpath.spi.json.JsonSmartJsonProvider”。@JhutanDebnath然后您会遇到一些不同的问题。我添加了一个完整的测试应用程序,您可以尝试。错误消息表明您使用了一些不同的json(在message\u metadata
“message\u metadata”中使用了一些字符串):“some\u string”
)当我使用两个单独的语句获取事件类型时,它会起作用:
val eventMetaData=JsonPath.read[string](message,$.message\u metadata)打印(eventMetaData)val eventType=JsonPath.read[String](eventMetaData,“$.event\u type”)eventType
//MerchantRegistrationFraudEvaluation。但在单个语句中尝试获取事件类型时失败
JsonPath.read[String](jsonString,“$.message\u metadata.event\u type”)
我必须在一行中完成这项工作。有什么方法可以实现吗?