首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JSONPath和json4s

JSONPath和json4s
EN

Stack Overflow用户
提问于 2017-07-21 14:22:40
回答 2查看 818关注 0票数 0

我需要从消息中提取字段值:

代码语言:javascript
复制
{
  "data": {
    "code": "404",
    ...
  }
}

JSONPath表达式存储在一个变量中:

代码语言:javascript
复制
val path = "/data/code"

我使用json4s来操作JSON。

从文档中,可以使用DSL实现这一点:

代码语言:javascript
复制
val json = parse(message)
val code = json \ "data" \ "code"

它可以工作,但是很明显,JSONPath表达式应该是硬编码的。有任何方法来计算作为字符串存储的表达式吗?类似于:

代码语言:javascript
复制
val code = json.evaluateJSONPath(path)
EN

回答 2

Stack Overflow用户

发布于 2017-07-21 14:34:44

假设json路径是以逗号分隔的字符串格式提供的,那么下面的内容就可以了。

代码语言:javascript
复制
import org.json4s._
import org.json4s.native.JsonMethods._
val json = parse(""" { "data": { "code": "404", "foo": "bar" } } """)
val path = "data,code" // json path in string 
path.split(',').foldLeft(json)({ case (acc, node) => acc \ node })

编辑:添加一个隐式类以简化访问

代码语言:javascript
复制
implicit class JsonHelper(json: JValue) {
    def customExtract[T](path: String)(implicit formats: Formats, mf: Manifest[T]) = {
        path.split(',').foldLeft(json)({ case (acc: JValue, node: String) => acc \ node }).extract[T]
    }
}

json.customExtract[String]("data,code")
res23: String = "404"
票数 2
EN

Stack Overflow用户

发布于 2017-07-21 15:04:35

如何使用高阶函数映射提取命令,如:

代码语言:javascript
复制
val extractCodeFunc = (j: JValue) => j \ "data" \ "code"

提取json

代码语言:javascript
复制
val res = extractCodeFunc.apply(json)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45240109

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档