"\" и \ "" добавлены при добавлении документов из Json в базу данных mongo - PullRequest
0 голосов
/ 15 января 2019

мой 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)))

при запросе монго я получаю

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

но я хочу это

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

Я пытался понять, почему могут быть лишние кавычки, но не могу найти причину.

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Проблема в том, что вы делаете toString для JsValue.

Когда вы делаете toString для JsValue, который является JsString, вы получаете строку, которая имеет значение "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))
0 голосов
/ 15 января 2019
jsval => jsval.toString()

Это даст вам JSON представление jsval. Если это был JsString, это будет текстовый контент с двойными кавычками (и, возможно, экранированный).

Вы, вероятно, хотите проанализировать JSON в классе дел (sourceOrganisation = Json.parse(something).as[TheCaseClass]). Таким образом, вы также можете избежать ручного разбора с jsArray \\ "name"

Или, по крайней мере, окончательное извлечение строки из финальной jsval (если вы знаете, что это JsString, вы можете сделать jsval.as[String]).

0 голосов
/ 15 января 2019
val organisations: Seq[String] = (sourceOrganisations.as[JsArray] \\ "name").map(jsval => jsval.toString().replaceAll("\"",""))

добавлен replaceAll ("\" "," ") в строке, чтобы исправить это. Понятия не имею, почему он добавил qoutes, хотя

...