【问题标题】:Parsing document fragments with lift-json使用 lift-json 解析文档片段
【发布时间】:2011-12-28 06:02:12
【问题描述】:

当我可能不知道我正在解析的文档的确切结构和顺序时,我正在尝试使用 lift-json 解析 JSON 文档。该文档包含“对象”列表,所有对象都组织成该对象类型的部分,每个部分都以该类型命名。我已经尝试了各种方法来循环类型,对类型名称进行模式匹配,然后尝试获取该对象列表,但它似乎永远无法正常工作。我要么得到一个空白列表,要么得到一个关于无法找到正确的 JSON 块来映射到我的案例类的错误。

这里有一些(几乎是伪的)代码,和我来的一样接近:

case class TypesQueries(queries: Map[String, JValue]);

case class AddressQueries(addresses: List[AddressQuery]);
case class AddressQuery(street: String, city: String, state: String, zip: Int)

case class NameQueries(names: List[NameQuery]);
case class NameQuery(firstName: String, lastName: String);

case class EmailQueries(emails: List[EmailQuery]);
case class EmailQuery(emailAddress: String);

val jsonData = parse("""{
    "queries" : {
        "addresses" : [
            {
                "street" : "1234 Main St.",
                "city" : "New York",
                "state" : "New York",
                "zip" : 12345
            },
            {
                "street" : "9876 Broadway Blvd.",
                "city" : "Chicago",
                "state" : "IL",
                "zip" : 23456
            }
        ],
        "names": [
            {
                "firstName" : "John",
                "lastName" : "Doe"
            }
        ],
        "emails" : [
            {
                "emailAddress" : "john.doe@gmail.com"
            },
            {
                "emailAddress" : "david.smith@gmail.com"
            }
        ]
    }
}""");


val typesQuery = parse(jsonData).extract[TypesQueries];

typesQuery.queries.foreach { case(queryType, queryDefinition) =>
    queryType match {
        case "addresses" =>
            // These extract methods do not work.
            val addressQueries = queryDefinition.extract[AddressQueries];
        case "names" =>
            // These extract methods do not work.
            val nameQueries = queryDefinition.extract[NameQueries];
        case "emails" =>
            // These extract methods do not work.
            val emailQueries = queryDefinition.extract[EmailQueries];
    }
}

“地址”、“姓名”和“电子邮件”可以在“查询”中以任意顺序出现,并且它们的数量可能不定。

最后,我希望能够为相应的类型列表提取对象列表,然后在解析完成后,将各种对象列表传递给适当的方法。

所以,问题是:如果我提前不知道完整的文档结构是什么,我该如何解析为 lift-json 中的案例类。

【问题讨论】:

    标签: json scala lift lift-json


    【解决方案1】:

    你非常接近,这适用于 repl:

    更新

    typesQuery.queries.foreach { 
      case(queryType, queryDefinition) => queryType match {
        case "addresses" => val addressQueries = typesQuery.queries.extract[AddressQueries]; println(addressQueries)
        case "names" => val nameQueries = typesQuery.queries.extract[NameQueries]; println(nameQueries)
        case "emails" => val emailQueries = typesQuery.queries.extract[EmailQueries]; println(emailQueries)
      }
    }
    

    这个想法是 foreach “删除”了包含每个“对象”的列表,因此我们调用 typesQuery.queries.extract 来帮助案例类匹配我们解析的 json

    【讨论】:

    • 嗯,有没有办法避免 JObject(List(Field.. 噪音?它让我认为应该是非常简单直接的代码看起来非常混乱。
    • 那个版本似乎会产生一个错误net.liftweb.json.MappingException: No usable value for addresses,但我知道你要去哪里。
    • 您使用的是最新的 lift-json 吗?我正在使用 2.4-M4(2.4-M5 是最新的。
    • 是的,这行得通,我的 JSON 文件中有错字。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-22
    • 2018-11-02
    • 2016-04-11
    • 2020-11-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    相关资源
    最近更新 更多