首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lift-json解析文档片段

使用lift-json解析文档片段
EN

Stack Overflow用户
提问于 2011-11-14 06:25:38
回答 1查看 359关注 0票数 0

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

下面是一些(几乎是伪的)代码,就像我之前提到的一样:

代码语言:javascript
复制
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中解析到case类。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-14 11:52:38

你离得很近,这在repl上很有效:

(更新后的)

代码语言:javascript
复制
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来帮助case类匹配我们解析的json。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8115240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档