Json como mapear esse objeto

4 respostas Resolvido
javaspring
MarceloNeo

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.

MarceloNeo

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

MarceloNeo
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