gpt4 book ai didi

json - 用 1 个元素解析 Json 列表(Scala/liftweb)

转载 作者:行者123 更新时间:2023-12-03 17:55:01 24 4
gpt4 key购买 nike

我遇到了从外部服务器检索一些 Json 的情况(我对该服务器没有任何控制权)。 Json 有一个可能出现 1 次或多次的元素。我正在尝试使用 net.liftweb.json 工具解析它,并且只有在元素出现多次时才能正常工作。如果元素只出现一次,则解析失败。

下面是一些示例代码:

import net.liftweb.json._
import net.liftweb.json.JsonDSL._

case class JSonListIssue(foo: List[String])

class JSonTest extends TestCase {

implicit val formats = net.liftweb.json.DefaultFormats;

def testJsonList {
val jsonStr2Foos = "{\"foo\": \"bar\", \"foo\": \"bar2\"}"
val json = (parse(jsonStr2Foos).extract[JSonListIssue])
assertEquals(2, json.foo.size)

val jsonStr1Foo = "{\"foo\": \"bar\"}"
val json2 = (parse(jsonStr1Foo).extract[JSonListIssue]) // Results in Json MappingException
assertEquals(1, json2.foo.size)
}

}

上面代码中的第二个解析语句失败。如果我将 case 类定义如下,第二个解析会起作用,但第一个会失败。
    case class JSonListIssue(foo: String)

关于如何以干净的方式解决这个问题的任何建议?我当然可以捕获 MappingException 然后使用另一个案例类解析它,但是那个脏...

谢谢,
下吕

最佳答案

因此,首先,虽然您无法控制编写该 API 的人,但如果您遇到他们,请不要因为他们做了如此愚蠢的事情而向他们开枪。 :P

所以,这不是世界上最干净的解决方案,但我想我想出了一些对你有用的东西。可以使用 \ 直接查询通过解析 JSON 产生的 JValue运算符(operator)。

所以,这样的事情应该适合你。

case class JsonListIssue(foo: List[String])

def extractJsonListIssue(json: JValue) = {
json \ "foo" match {
case JString(foo) =>
JsonListIssue(List(foo))

case _ =>
json.extract[JsonListIssue]
}
}

您可能需要也可能不需要 json \ "foo" 周围的括号为了编译。但!我认为在大多数情况下这对你有用。 FWIW,如果你想成为真正的 Lift-y,你应该认真考虑在这里使用 Box 并使用 tryo 将任何异常从提取转换为失败,你可以在调用堆栈中 catch 更高的位置。所以,这看起来像这样:
// Add these guys to your existing imports
import net.liftweb._
import common._
import util.Helpers._

case class JsonListIssue(foo: List[String])

def extractJsonListIssue(json: JValue) = {
json \ "foo" match {
case JString(foo) =>
Full(JsonListIssue(List(foo)))

case _ =>
// Will return a Full with the result of the method on
// success and a Failure if extract throws an exception.
tryo(json.extract[JsonListIssue])
}
}

然后,您可以在代码的其他地方使用它来理解。

如果这不起作用,请告诉我。如果我有什么更清洁的事情,我会告诉你的。队友的欢呼声!

关于json - 用 1 个元素解析 Json 列表(Scala/liftweb),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12640778/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com