Tengo una estructura JSON que dice así
{ "name":"John", "age":27, "company":{ "company_name":"ACME LLC", "address": "1st Street", "country": "US" } }Sé que si quiero asignar esto a un objeto Java, necesito algún tipo de asignador y lo he hecho.
Mi pregunta es: ¿hay alguna manera de mapear solo una parte de este json en object. Me gustaría mapear solo la parte de la company de json en el objeto. Una cosa más, estoy usando Java 11 con Spring Boot y tengo acceso al mapeador de objetos de Jackson.
Editar: también, si hay una forma de navegar a este objeto, estaría bien. Por ejemplo $.company
Creo que la forma más fácil es crear dos clases modelo. Primero con un campo:
@Data public class Model { private Company company; }y segundo:
@Data public class Company { @JsonProperty("company_name") private String companyName; private String address; private String country; }Entonces puedes usar el mapeador de Jackson. No necesita mencionar los campos "mapa" y "edad" en la clase Modelo.
Ok, encontré una respuesta, gracias @Jakub por tu respuesta, fue de gran ayuda. Enlace para comentar .
Este es un ejemplo de código de respuesta basado en mi pregunta:
public class Company { private String name; private String address; private String country; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } }Método de prueba/ejecución:
@Test public void testJSON() throws JsonProcessingException { JsonNode productNode = objectMapper.readTree("{\n" + " \"name\":\"John\",\n" + " \"age\":27,\n" + " \"company\":{\n" + " \"name\":\"ACME LLC\",\n" + " \"address\": \"1st Street\",\n" + " \"country\": \"US\"\n" + " }\n" + "}"); Company company = objectMapper.readValue(productNode.get("company").toString(), Company.class); System.out.println(company.getAddress()); }Sugeriría usar la biblioteca DSM .
defina su asignación en el archivo yaml, solo desea el campo de la empresa. Entonces su archivo de mapeo será como a continuación.
result: type: object path: /company fields: name: # read value from field in path path: company_name address: #field name is the same country:Código Java para leer el archivo:
DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).create(); Map<String,Object> result= ( Map<String,Object>)dsm.toObject(jsonData);el resultado es un mapa que contiene información en el campo de la empresa en json.
Si desea obtener directamente una instancia de la clase mediante la deserialización:
public class Company{ String name; String address; String country; }Código Java para deserializar:
DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).create(); Company result= dsm.toObject(jsonData,Company.class);