【问题标题】:Cut off the field from JSON string从 JSON 字符串中截断字段
【发布时间】:2016-11-30 18:47:37
【问题描述】:

我有一个这样的 JSON 字符串:

{"id":"111","name":"abc","ids":["740"],"data":"abc"}

我想切断字段"ids",但是我不知道像["740"] 这样的值。所以,它可能是例如["888,222"] 或其他。目标是获取不带"ids"字段的json字符串。

怎么做?我应该使用JackMapper吗?

编辑:

我尝试将JackMapper 用作JacksMapper.readValue[Map[String, String]](jsonString)to get only fields that I need. But the problem is that"ids":["740"]` 引发解析错误,因为它是一个数组。所以,我决定在解析之前切断这个字段,虽然这是一个丑陋的解决方案,理想情况下我只想将 json 字符串解析为 Map。

【问题讨论】:

  • 您使用什么编程语言?
  • @BrankVictoria: scala,如标签所示
  • @cchantep:我尝试将JackMapper 用作JacksMapper.readValue[Map[String, String]](jsonString),然后只获取我需要的字段。但问题是"ids":["740"] 抛出解析错误。所以,我决定在解析之前切断这个字段,虽然这是一个丑陋的解决方案,理想情况下我只想将 json 字符串解析为 Map。
  • 我不了解 JacksMapper,但您可以尝试将您的值读取为 Map[String, JsonValue] 这样,您可以摆脱 ids 而不会出现解析错误
  • @LouisF。这确实是个好主意。您能否在答案中显示它?

标签: json scala


【解决方案1】:

不确定 JackMapper 是什么,但如果允许使用其他库,我个人最喜欢的是:

Play-JSON:

val jsonString = """{"id":"111","name":"abc","ids":["740"],"data":"abc"}"""
val json = Json.parse(jsonString).as[JsObject]
val newJson = json - "ids"

Circe:

import io.circe.parser._

val jsonString = """{"id":"111","name":"abc","ids":["740"],"data":"abc"}"""
val json = parse(jsonString).right.get.asObject.get // not handling errors
val newJson = json.remove("ids")

请注意,这是让您继续前进的最小示例,它不会处理错误的输入等。

【讨论】:

  • 在第一种解决方案(Play-JSON)的情况下,如何将newJson转换为Map[String,String]
  • 我是这样做的:newJson.fields.toMap.map(v => (v._1,v._2.toString))
  • newJson.value.mapValues(_.toString())
  • 我忘了说我仅限于 Java 1.7 和 Scala 2.10。我看到 Circe 解析器仅适用于 Scala 2.11 (mvnrepository.com/artifact/io.circe/circe-parser_2.11/0.6.1),而 Play-JSON 需要 Java 8。
  • Play JSON 已经出现在 Java 7 中。这是播放 2.4。切换到 Java 8(由于 Java 7 已被宣布弃用并在 2015 年 4 月达到其生命周期的终点)。只要确保获得正确的依赖关系。您可以通过libraryDependencies += "com.typesafe.play" %% "play-json" % "2.3.4" 获得 2.3.4。当然,API 可能不同,但肯定支持您的用例。这是文档的link
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-29
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
相关资源
最近更新 更多