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