【发布时间】:2012-09-28 13:16:15
【问题描述】:
我遇到了从外部服务器检索一些 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)
}
}
上述代码中的第二个 parse 语句失败。如果我将 case 类定义如下,则第二个解析将起作用,但第一个解析将失败。
case class JSonListIssue(foo: String)
有关如何以干净的方式解决此问题的任何建议?我当然可以捕获 MappingException,然后使用另一个案例类对其进行解析,但那很脏......
谢谢, 格罗
【问题讨论】:
-
仅供参考,您可以在 scala 中使用三引号字符串。这样一来,
jsonStr2Foos = """{"foo": "bar", "foo": "bar2"}"""就不必转义所有这些引号。 -
如果你改为尝试:case class FooBar (foo:String, bar:String),然后:val json = parse(jsonStrFoo).extract(List[FooBar]) ?
-
没关系,这行不通。我读错了你的输入。