我的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" }
我尝试查看为什么可能会有多余的引号,但找不到原因
答案 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]
)。