2

我正在尝试学习 DynamoDb 并尝试使用 Amazon 开发人员指南中的示例将数据从 json 加载到表中,但我遇到了以下异常:

com.fasterxml.jackson.databind.node.IntNode cannot be cast to com.fasterxml.jackson.databind.node.ObjectNode

在下面的行:

 currentNode = (ObjectNode) iter.next();

你能告诉我我在这里做错了什么吗?

你也可以告诉我有什么方法可以使用 GUI 来查看我的表格内容。我在我的项目中使用使用 maven 的 DynamoDbLocal。

谢谢,

4

2 回答 2

1

我的 json 文件中存在问题。我在输入文件中使用 json,如下所示:

{ 
"year" : "2013",
"title" : "Turn It Down, Or Else!",
"info" : {
    "directors" : [
        "Alice Smith",
        "Bob Jones"
    ],
    "release_date" : "2013-01-18T00:00:00Z",
    "rating" : "6.2",
    "genres" : [
        "Comedy",
        "Drama"
    ],
    "image_url" : "http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
    "plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
    "rank" : "11",
    "running_time_secs" : "5215",
    "actors" : [
        "David Matthewman",
        "Ann Thomas",
        "Jonathan G. Neff"
   ]
 }
}

虽然我的代码期望这样:

[
{  
"year" : "2013",
"title" : "Turn It Down, Or Else!",
"info" : {
    "directors" : [
        "Alice Smith",
        "Bob Jones"
    ],
    "release_date" : "2013-01-18T00:00:00Z",
    "rating" : "6.2",
    "genres" : [
        "Comedy",
        "Drama"
    ],
    "image_url" : "http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg",
    "plot" : "A rock band plays their music at high volumes, annoying the neighbors.",
    "rank" : "11",
    "running_time_secs" : "5215",
    "actors" : [
        "David Matthewman",
        "Ann Thomas",
        "Jonathan G. Neff"
   ]
  }
 }
]
于 2019-05-08T11:05:03.437 回答
1

ObjectNode 不是的后代,IntNode因此您不能将 IntNode 强制转换为 ObjectNode。您需要将该特定代码行转换为IntNode

 IntNode currentNode = (IntNode) iter.next();

或任何超类IntNode

 JsonNode currentNode = (JsonNode) iter.next();

这是 ObjectNode 的层次结构

java.lang.Object*
  com.fasterxml.jackson.databind.JsonSerializable.Base*
    com.fasterxml.jackson.databind.JsonNode*
      com.fasterxml.jackson.databind.node.BaseJsonNode*
        com.fasterxml.jackson.databind.node.ContainerNode<ObjectNode>
          com.fasterxml.jackson.databind.node.ObjectNode

这是 IntNode 的层次结构

java.lang.Object*
  com.fasterxml.jackson.databind.JsonSerializable.Base*
    com.fasterxml.jackson.databind.JsonNode*
      com.fasterxml.jackson.databind.node.BaseJsonNode*
        com.fasterxml.jackson.databind.node.ValueNode
          com.fasterxml.jackson.databind.node.NumericNode
            com.fasterxml.jackson.databind.node.IntNode

我添加了一个接近常见超类的 *,您可以使用它来转换一个更通用的类型,该类型可以同时包含IntNodeObjectNode.

请注意,如果需要,您还需要currentNode相应地更改变量的类型。


但这里奇怪的是,你需要使用杰克逊进行如此深入的研究。为什么不将存储在 DynamoDb 中的数据转换为 bean,如果您的数据没有预定义的结构(因此您还没有定义 bean 来托管它们),您也可以使用Map.

dynamodb java 库的一些功能会自动为您执行此操作,例如您可以使用类似于以下的代码:

    Table table = getDynamoDB().getTable("yourTable");
    Item item = table.getItem("id", "yourId");
    Map map = item.asMap();
    // map is holding in java the data present on Dynamodb
    // in the table yourTable with id yourId
于 2019-05-08T08:08:13.540 回答