com.fasterxml.jackson.databind.node.IntNode нельзя преобразовать в com.fasterxml.jackson.databind.node.ObjectNode - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь выучить DynamoDb и пытаюсь загрузить данные из json в таблицу, используя пример в Руководство разработчика Amazon , но я получаю следующее исключение:

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

в строке ниже:

 currentNode = (ObjectNode) iter.next();

Подскажите, пожалуйста, что я здесь не так делаю.

Также, пожалуйста, дайте мне знать, есть ли способ использовать графический интерфейс для просмотра содержимого таблицы.Я использую DynamoDbLocal с использованием Maven в моем проекте.

Спасибо,

Ответы [ 2 ]

0 голосов
/ 08 мая 2019

Проблема была в моем файле 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"
   ]
  }
 }
]
0 голосов
/ 08 мая 2019

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

Я добавил * близкий к обычным суперклассам, которые можно использовать для приведения типов к более универсальному типу, который может включать как IntNode, так и ObjectNode.

Обратите внимание, что вам также необходимо изменить тип переменной currentNode в соответствии с приведением при необходимости.


Но странно то, что вам нужно пойти на такой глубокий уровень, используя Джексона. Почему бы вам не преобразовать данные, хранящиеся в DynamoDb, в виде bean-компонента, если у вас нет предопределенной структуры для ваших данных (и поэтому вы еще не определили bean-компонент для их размещения), вы также можете использовать Map .

Существуют функции библиотеки Java DynamodB, которые делают это автоматически, например, вы можете использовать код, подобный следующему:

    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
...