1

私は次の文書を持っています:

{
  "_index" : "testdb",
  "_type" : "artWork",
  "_id" : "0",
  "_version" : 4,
  "found" : true,
  "_source":{"uuid":0,
             "StatusHistoryList":[
        {
        "ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
        "ArtworkStatus":"ACTIVE"
        },
        {
        "ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
        "ArtworkStatus":"INACTIVE"
        }
             ]
}

ドキュメントのマッピングは次のとおりです。

{
  "testdb" : {
    "mappings" : {
      "artWork" : {
        "properties" : {
          "StatusHistoryList" : {
            "type" : "nested",
            "properties" : {
              "ArtWorkDate" : {
                "type" : "string",
                "store" : true
              },
              "ArtworkStatus" : {
                "type" : "string",
                "store" : true
              }
            }
          },

          "uuid" : {
            "type" : "integer",
            "store" : true
          }
        }
      }
    }
  }
}

の値にアクセスしたいと思いますStatusHistoryList。次のようにすると、null 値が得られます。

val get = client.prepareGet("testdb", "artWork", Id.toString()).setOperationThreaded(false)
        .setFields("uuid",,"StatusHistoryList.ArtworkStatus","StatusHistoryList.ArtWorkDate","_source")

        .execute()
        .actionGet()
  var artworkStatusList= get.getField("StatusHistoryList.ArtworkStatus").getValues.toArray()

var artWorkDateList= get.getField("StatusHistoryList.ArtWorkDate").getValues.toArray()

次に、コードからnull値を取得しましたが、ドキュメントに値が含まれているため、この質問を見つけた ので、このようにしようとしました

 var smap = get.getSource.get("StatusHistoryList").asInstanceOf[Map[String,Object]]

しかし、その後 aClassCastExceptionがスローされます

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.util.Map

StatusHistoryListの 値ArtworkStatusを取得する方法を教えてくださいArtWorkDate。値を教えてください。よろしくお願いします。

4

1 に答える 1

0

あなたはほとんど解決策を導き出しました。GET 要求は応答を取得しましたが、応答の解析に問題があります。

問題を見てみましょう。以下は、エラスティック検索がソースとして返すドキュメントです

{
    "uuid":0,
    "StatusHistoryList":[
       {
          "ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
          "ArtworkStatus":"ACTIVE"
       },
       {
          "ArtWorkDate":"2015-08-28T15:52:03.030+05:00",
          "ArtworkStatus":"INACTIVE"
       }
    ]
}

これを行うget.getSource.get("StatusHistoryList")と、Map ではなく List ArtWork オブジェクトが返されます。classCastExceptionそれが例外の理由です。

したがって、オブジェクトのリストに応答をキャストすると、問題は解決されます。

しかし、これは理想的な解決策ではありません。Jackson-Faterxmlのようないくつかのライブラリは、あなたのために仕事をします。fastxml ライブラリを使用すると、json を同等の POJO オブジェクトにバインドできます。

于 2015-08-28T13:50:02.093 に答える