将文档从Json添加到mongo DB时添加了“ \”和“””

时间:2019-01-15 12:33:47

标签: scala play-reactivemongo

我的json看起来像这样。

[
  {"name": "AABC Register Ltd (Architects accredited in building conservation), with effect from the 2016 to 2017 tax year"},
  {"name": "Academic and Research Surgery Society of"},
  {"name": "Academic Gaming and Simulation in Education and Training Society for"},
  {"name": "Academic Primary Care Society for"}
]

和我用来解析并将其添加到mongoDB的代码是

val sourceOrganisations: JsValue = Json.parse(getClass.getResourceAsStream("/json/ApprovedOrganisations.json"))

val organisations: Seq[String] = (sourceOrganisations.as[JsArray] \\ "name").map(jsval => jsval.toString())

println(organisations)

organisations.foreach(organisation => this.insert(Organisation(organisation)))

查询mongo时我得到

{ "_id" : ObjectId("5c3dcf309770222486f50b4a"), "name" : "\"Accounting Association American\"" }

但是我想要这个

{ "_id" : ObjectId("5c3dcf309770222486f50b4a"), "name" : "Accounting Association American" }

我尝试查看为什么可能会有多余的引号,但找不到原因

3 个答案:

答案 0 :(得分:1)

问题是因为您正在对JsValue执行toString。

当您对作为JsString的JsValue执行toString时,会得到一个字符串,其值为"value_inside_JsString"

val jsValue: JsValue = JsString("a")
val extraQuotedString = "[[" + jsValue.toString() + "]]"
// extraQuotedString: String = [["a"]]

正确的方法是首先将其转换为JsString并通过.value获取其值。

val correctString = "[[" + jsValue.as[JsString].value + "]]"
// correctString: String = [[a]]

所以

val json = Json.parse(jsonString)

val organizationsAsJsValues = json match {
  case jsArray: JsArray => jsArray \\ "name"
  case _ => Seq.empty[JsValue]
}

val organizationAsNames = organizationsAsJsValues.flatMap({
  case jsString: JsString => Some(jsString.value)
  case _ => None
})

val organizations = organizationAsNames.map(name => Organization(name))

答案 1 :(得分:0)

val organisations: Seq[String] = (sourceOrganisations.as[JsArray] \\ "name").map(jsval => jsval.toString().replaceAll("\"",""))

已添加 replaceAll(“ \”“,”“)进行行修复。不知道为什么通过

添加qoutes

答案 2 :(得分:0)

jsval => jsval.toString()

这将为您提供jsval的JSON表示形式。如果这是一个JsString,它将是双引号(并且可能是转义的)文本内容。

您可能想将JSON解析为案例类(sourceOrganisation = Json.parse(something).as[TheCaseClass])。这样,您还可以避免使用jsArray \\ "name"

进行手动解析

或者至少从最终jsval中提取字符串(如果您知道它是JsString,则可以执行jsval.as[String])。