Cómo convertir JSON nombre del campo a Java propiedad de clase de frijol con Jackson

ErnstZ:

Tengo acceso a una API REST que devuelve JSON Cuerdas, tales como los siguientes:

{
    "Container1": {
        "active": true
    },
    "Container2": {
        "active": false
    },
}

El problema es que la API REST es un poco maldesigned. El campo de datos contiene los datos ya. Con la biblioteca de Jackson no es posible para deserializar el nombre del campo a un nombre de propiedad de la clase Java bean correspondiente. Asumo, esto no pretende por la especificación JSON ninguno. Lo anterior cadena JSON necesita ser deserializado a una instancia de la clase siguiente:

public class Container {
    private Boolean active;
    private String name;
}

Termino con UnrecognizedPropertyExceptionel campo Container1.

Pensé que configure para ignorar propiedades desconocidas y para proporcionar una JsonDeserializerpara esa propiedad como esta:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Container {
    private Boolean active;
    private String name;

    @JsonDeserialize(using = FieldNameToPropertyDeserializer.class)
    public void setName(String name) {
        this.name = name;
    }
}

y FieldNameToPropertyDeserializer:

public class FieldNameToPropertyDeserializer extends StdDeserializer<String> {
    public FieldNameToPropertyDeserializer() {
        super(String.class);
    }

    @Override
    public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
        return parser.getCurrentName();
    }
}

La invocación de la deserialización se logra como sigue:

String jsonString = response.readEntity(String.class);
ObjectMapper objectMapper = new ObjectMapper();
ObjectReader readerFor = objectMapper.readerFor(Container.class);
MappingIterator<Container> mappingIterator = readerFor.readValues(jsonString);
while (mappingIterator.hasNext()) {
    Container container = (Container) mappingIterator.next();
    containers.add(container);
}

Pero sólo recibo objetos vacíos (propiedades determinan a null) debido a que el análisis de las propiedades se salta desde el conjunto I @JsonIgnoreProperties(ignoreUnknown = true).

Es esto posible? O debería poner en práctica algo así como un post-procesamiento después?

Hades:

Sólo una solución rápida, si el objeto es tal que, para que toda ella objeto es un objeto contenedor que puede recibir el interior JSON y JSONObject puede usar debajo de código

import java.io.IOException;
import org.json.JSONException;
import org.json.JSONObject;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class TestSO {

    public static void main(String[] args) throws JsonParseException, JsonMappingException, JSONException, IOException {
        String jsonString = "{\r\n" + 
                "    \"Container1\": {\r\n" + 
                "        \"active\": true\r\n" + 
                "    },\r\n" + 
                "    \"Container2\": {\r\n" + 
                "        \"active\": false\r\n" + 
                "    },\r\n" + 
                "}";

        JSONObject jsonObject = new JSONObject(jsonString);

        ObjectMapper mapper = new ObjectMapper();
        for (String key : jsonObject.keySet()) {
            Container container = mapper.readValue(jsonObject.get(key).toString(), Container.class);
            System.out.println(container);
        }   
    }

    static class Container{
        private String name;
        private Boolean active;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public Boolean getActive() {
            return active;
        }
        public void setActive(Boolean active) {
            this.active = active;
        }
        @Override
        public String toString() {
            return "Container [name=" + name + ", active=" + active + "]";
        }
    }
}

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=333378&siteId=1
Recomendado
Clasificación