0

解析しているドキュメントの正確な構造と順序がわからない場合に、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 でケース クラスに解析するにはどうすればよいかということです。

4

1 に答える 1

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 と一致するようにすることです。

于 2011-11-14T03:52:37.543 に答える