2016-06-21 4 views
1

Я пытаюсь использовать службу REST с помощью RestTemplate. У меня возникают проблемы с десериализацией ответа JSON. Я использую собственный Deserializer, и у моего JSON есть 3 узла, но похоже, что только один достигает десериализатора. Ниже приведены более подробные сведения.RestTemplate - Deserializer Jackson

Ниже приводится ответ JSON:

{ 
    "Hello": { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    }, 
    "Hello": { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    }, 
    "Hello": { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
} 

Я использую пользовательский десериализатор на класс Response для атрибута Привет с помощью @JsonDeserializer.

Когда я сделать readTree, как показано ниже:

JsonNode node = jp.getCodec().readTree(jp); 

достигает метода десериализации, похоже, что он испытывает только один узел, вместо 3, как показано ниже. Иногда он имеет первый узел, а иногда и последний. Что здесь может быть не так?

Заранее благодарим за этот вопрос и помощь!

ANSWER: Как уже упоминалось, этот JSON недействителен, и, следовательно, Джексон не может десериализовать его. Я должен был получить ответ как String, а затем десериализовать вручную.

ответ

1

JsonNode - суперкласс без определенного поведения контента. В вашем примере вы должны получить ObjectNode, но поскольку ваши свойства имеют одно и то же имя, останется только одно свойство «Hello». readTree() - это общий метод, который делает автоматическое приведение к вашему требуемому типу возврата, если это возможно.

Если вы действительно нуждаетесь в этом, вы должны переместить JSON в структуру массива:

// you will get one ArrayNode containing multiple ObjectNode 
[ 
    { 
    "Hello": { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    } 
    }, 
    { 
    "Hello": { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    } 
    }, 
    { 
    "Hello": { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
    } 
] 

или

// you will get one ObjectNode containing one property with an ArrayNode 
{ 
    "Hello": [ 
    { 
     "Hi": "Name1", 
     "Call": "PhoneNumber1" 
    }, 
    { 
     "Hi": "Name2", 
     "Call": "PhoneNumber2" 
    }, 
    { 
     "Hi": "Name3", 
     "Call": "PhoneNumber3" 
    } 
    ] 
} 
+0

Я потребляю услугу, которая существует в производстве сегодня и используется в других местах. Могу ли я преобразовать JSON в массив после получения ответа? – mandy

+0

Извините, это никогда не будет работать с Jackson imho, поскольку ObjectNode считается уникальным. –

+0

Единственный способ сделать это - это полный пользовательский десериализатор без использования древовидных методов, но вместо этого будет синтаксический анализ с использованием 'getCurrentToken()', 'get ... Value()' и 'nextToken()'. Разбор этого типа списка или нескольких карт. Будет много работы, но может работать в конце. –

1

Это, скорее всего, потому что это недействительно JSON, вы не можете иметь три узла с тем же именем.

Или, строго говоря, это не ошибка, но только один из элементов, названных «Hello» будет учитываться as stated in this answer, что это плохо, так как JSON не гарантирует порядок элементов в объекте только порядок элементов в списках.

Если у вас есть возможность изменить ответ, я бы пошел с созданием массива объектов.

{ "Hello": [ { "Hi": "Name1", "Call": "PhoneNumber1" }, { "Hi": "Name2", "Call": "PhoneNumber2" }, { "Hi": "Name3", "Call": "PhoneNumber3" } ] } Тогда вы получите JsonNode, который представляет собой массив JsonNodes, который вы можете перебрать.

+0

я потребляющая услугу, которая существует в современном производстве и в настоящее время используется в других мест. Могу ли я преобразовать JSON в массив после получения ответа? – mandy

+0

Возможно, этот ответ может помочь вам: http://stackoverflow.com/questions/27710471/java-json-with-duplicate-keys-to-map-using-jackson, обязательно прочитайте там комментарии :) –

+0

Спасибо @ Daniel, я попробую Guava и обновить его здесь. – mandy

 Смежные вопросы

  • Нет связанных вопросов^_^