Json como mapear esse objeto

4 respostas Resolvido
javaspring
M

Estou tendo problema em mapear esse objeto com o Jackson Annatations

{
    "id":"7149",
    "currency":"BRL",
    "features":
        {
            "consta2":  {  "name":"Consta teste dois","value":2  },
            "consta1":  {  "name":"Consta teste um","value":1   }
        }
}

Estou usando o Spring 4.3, e Jackson. MappingJackson2HttpMessageConverter

org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

Junto com o restTemplate

Erro que gera

org.springframework.http.converter.HttpMessageNotReadableException: Could not read document: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

nested exception is com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token

Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
…at [Source: java.io.PushbackInputStream@fd42b93; line: 1, column: 131] (through reference chain: com…SysSubscription[“features”])

Estou mapeado objeto assim

@JsonInclude(Include.NON_NULL)
@JsonProperty("features")
private List<SysFeature>    features;

Alguma dica?

4 Respostas

L

Do jeito que está aí, você tem um objeto features que tem duas propriedades “consta1” e “consta2” que são classes com uma string e um int. Não seria isso?

J

Também tive um problema parecido com este…
pois utilizei este projeto no GitHub

mas na classe JSONBUserType eu alterei a nullSafeGet para

`   <a class="mention" href="/u/override">@Override</a>

public Object nullSafeGet(ResultSet resultSet, String[] names,

SessionImplementor session, Object owner)

throws HibernateException, SQLException {
final String json = resultSet.getString(names[0]);
    return json == null
            ? null
            : getList(json);
}

public <T> Object getList(String json) {
    java.lang.reflect.Type Type_temp = returnedClass.getClass();
    Gson gson = new Gson();
    java.lang.reflect.Type listType = new com.google.gson.reflect.TypeToken<List<Endereco>>(){}.getType();
    return gson.fromJson(json, listType);
}`

assim conseguir recuperar a lista de objetos Endereco…
Mas a classe não ficou genérica… então estou procurando uma forma de não precisar passar a Classe, mas sim usar uma variável returnedClass tipo Class e assim ficar genérica.

neste projeto consegui salvar tranquilo e recuperar apenas com essa alteração.

M

Pior que não, consta1 e consta2 são variáveis, sim! Até tentei falar que isso não esta certo! para o fornecedor do rest, mas diz que não! o problema é que meus convertes não sabem resolver isso.

coloquei nesse site funciona, mas não sei como mapear isso Teste.
Estou fazendo uns ajustes aqui, hoje ou amanhã posto os resultados

M
Solucao aceita

Consegui resolver

@JsonInclude(Include.NON_NULL)
@JsonProperty(“features”)
private Map < String, Feature > features;

  • jpmpassos, também deu problema parecido com o que falou,
  • O problema aqui era que meu Objeto JSON, não tinha um construtor vazio!

Por exemplo

  • Tipo o construtor vazio não precisa declarar, Depende do caso
  • Mas se declarar um não vazio, tem que declar o vazio. Para ter o vazio.
  • Muitos framewoks usam objetos com construtor vazio.
  • Então precisar declarar, por exemplo o jackson precisa de um construtor vazio.
  • Ve ai quem sabe é a solução para esse problema que falou.

Obrigado a todos pelas participações!

Criado 29 de julho de 2016
Ultima resposta 29 de jul. de 2016
Respostas 4
Participantes 3