Разбор фрагментов документа с помощьюift-json - PullRequest
0 голосов
/ 14 ноября 2011

Я пытаюсь проанализировать документ JSON с помощью lift-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, если я не знаю, какая полная структура документа будет опережать время.

1 Ответ

1 голос
/ 14 ноября 2011

Вы были очень близки, это работает на 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, чтобы помочь классам case соответствовать нашему разобранному json

...