首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Hcursor或Optics作为Circe-Json的一部分来返回匹配对象的列表?

如何使用Hcursor或Optics作为Circe-Json的一部分来返回匹配对象的列表?
EN

Stack Overflow用户
提问于 2018-12-18 23:04:41
回答 1查看 723关注 0票数 1

我的代码大致如下所示:

代码语言:javascript
复制
val json: Json = parse("""
[
{
"id": 1,
"type": "Contacts",
"admin": false,
"cookies": 3
},
{
"id": 2,
"type": "Apples",
"admin": false,
"cookies": 6
},
{
"id": 3,
"type": "Contacts",
"admin": true,
"cookies": 19
}
]
""").getOrElse(Json.Null)

我使用了Circe、Cats、Scala、Circe-json等等,并且Parse调用成功。

我想返回一个列表,其中type="Contacts“所在的每个顶级对象都完整地显示出来。

类似以下内容: ListString = "{"id":1,"type":“联系人”,"admin":false,"cookies":3}","{"id":3,"type":"Contacts","admin":true,"cookies":19}“

背景是我在磁盘上有很大的JSON文件。我需要过滤出与某个json值匹配的对象子集,在本例中为type=Contacts,然后将它们从type=文件的其余部分中分离出来。我并不打算修改这个文件,我更多的是在grep中寻找匹配的对象,并对它们进行相应的处理。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-19 00:57:53

完成这类工作的最直接方法是将文档解码为List[Json]List[JsonObject]值。例如,给定您对json的定义

代码语言:javascript
复制
import io.circe.JsonObject

val Right(docs) = json.as[List[JsonObject]]

然后您可以基于type进行查询

代码语言:javascript
复制
scala> val contacts = docs.filter(_("type").contains(Json.fromString("Contacts")))
contacts: List[io.circe.JsonObject] = List(object[id -> 1,type -> "Contacts",admin -> false,cookies -> 3], object[id -> 3,type -> "Contacts",admin -> true,cookies -> 19])

scala> contacts.map(Json.fromJsonObject).map(_.noSpaces).foreach(println)
{"id":1,"type":"Contacts","admin":false,"cookies":3}
{"id":3,"type":"Contacts","admin":true,"cookies":19}

考虑到您的用例,circe-optics似乎不太适合(请参阅my answer here,了解为什么使用Monocle的Traversal过滤使用任意谓词很困难)。

不过,如果您对解析和过滤大型JSON文件而不将文件的全部内容加载到内存中感兴趣,那么研究circe-fs2或circe-iteratee可能是值得的。在这两种情况下,原理都与上面的List[JsonObject]代码相同-将大的JSON数组解码为JsonObject值的流,您可以随心所欲地查询它。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53835860

复制
相关文章

相似问题

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