Scala Play Json JSResultException验证错误

时间:2016-09-12 23:32:29

标签: json scala playframework

我正在尝试将此json字符串传递给我的其他方法,但有时会出现此错误,

  

play.api.libs.json.JsResultException:   JsResultException(错误:列表((,列表(ValidationError(error.expected.jsstring,WrappedArray())))))

我觉得奇怪的是,这是随机发生的,有时候我不会得到例外,有时我会这样做。有什么想法吗?

这是我的json的样子

val string = {
  "first_name" : {
    "type" : "String",
    "value" : "John"
  },
  "id" : {
    "type" : "String",
    "value" : "123456789"
  },
  "last_name" : {
    "type" : "String",
    "value" : "Smith"
  }
}

我读它就像

(string \ "first_name").as[String]

3 个答案:

答案 0 :(得分:3)

(string \ "first_name")JsValue提供JsString,因此as[String]不起作用。

但如果你需要first name value,你可以做

val firstName = ((json \ "first_name") \ "value").as[String]

答案 1 :(得分:0)

这是在使用play Json API读写Json时要考虑类型安全的另一种选择。下面我展示了使用您的json作为示例阅读部分,并且写作类似。

  1. 将数据表示为案例类。

    case Person(id:Map[String,String], firstName:Map[String,String], lastName:[String,String]

  2. 为案例类写隐式读/写。

    implicit val PersonReads: Reads[Person]

  3. Employ播放组合器读取的API。将隐式导入您在其中读取json的位置,然后返回Person对象。下图是插图。

    val personObj = Json.fromJson[Person](json)

请在这里https://www.playframework.com/documentation/2.6.x/ScalaJsonAutomated

答案 2 :(得分:-2)

首先,您无法遍历 String 对象,因此您的输入必须转换为 JsValue 才能遍历它:

 val json = Json.parse(string)

那么 first_name 属性是 JsValue 类型而不是字符串所以如果您尝试提取 first_name 像你这样的价值,你会得到一个 JsResultException

我只能通过 first_name 字段json结构中的radom更改来解释 JsResultException 的随机外观。使你的sting输入到traverse始终是一个固定的 first_name 字段结构。