Lea múltiples archivos JSON de una carpeta en un mapa -- java campo con stream campo con jackson campo con inputstream campo con objectmapper camp Relacionados El problema

Read multiple JSON files from a folder into a map


0
vote

problema

Español

Para una ruta de carpeta dada, quiero cargar / transformar todos los archivos JSON dentro de esa carpeta en un solo mapa.

  InputStream input = new ClassPathResource(jsonFile).getInputStream(); jsonMap = new ObjectMapper().readValue(input,     new TypeReference<Map<String, MappedContacts>>() {});   

He logrado hacerlo por un solo archivo, pero no estoy seguro de cómo puedo hacer esto de manera eficiente para varios archivos.

Original en ingles

For a given folder path, I want to load/transform all the JSON files inside that folder in a single map.

InputStream input = new ClassPathResource(jsonFile).getInputStream(); jsonMap = new ObjectMapper().readValue(input,     new TypeReference<Map<String, MappedContacts>>() {}); 

I've managed to do it for a single file, but I'm not sure how can I do this efficiently for multiple files.

              

Lista de respuestas

0
 
vote

Puede usar @JsonMerge Anotación Para decirle a Jackson que su valor de propiedad debe usar el enfoque de "fusión".

... en el que se accede por primera vez el valor actual (con un entorno o un campo) y luego modificado con datos entrantes, o no: si no, la asignación ocurre sin considerar el estado actual

Vamos a tener en cuenta el ejemplo, Supongamos que tiene 2 (o más) archivos JSON:

contactos1.json

  {   "person1": {     "contacts": [1,2]   },   "person2": {     "contacts": []   } }   

y contactos2.json

  {   "person1": {     "contacts": [3,4]   },   "person2": {     "contacts": [100]   } }   

y su MappedContacts

  class MappedContacts {         @JsonMerge         List<Integer> contacts;          public List<Integer> getContacts() {             return contacts;         }          public void setContacts(List<Integer> contacts) {             this.contacts = contacts;         }          @Override         public String toString() {             return contacts.toString();         }     }   

Luego, para probarlo funciona, simplemente simple Hello Jackson Fusion:

  public static void main(String[] args) throws IOException {     TypeReference<Map<String, MappedContacts>> type = new TypeReference<Map<String, MappedContacts>>() {};     InputStream input = new ClassPathResource("contacts1.json").getInputStream();     InputStream input2 = new ClassPathResource("contacts2.json").getInputStream();     ObjectMapper mapper = new ObjectMapper();     Object contacts = mapper.readValue(input, type);     mapper.readerFor(type)             .withValueToUpdate(contacts)             .readValues(input2);          System.out.println(contacts);     }   

Salidas

  {a=[1, 2, 3, 4], b=[100]}   
 

You can use @JsonMerge annotation to tell jackson that your property value should use "merging" approach.

...In which current value is first accessed (with a getter or field) and then modified with incoming data, or not: if not, assignment happens without considering current state

Lets have look at example, assume you have 2 (or more) json files:

contacts1.json

{   "person1": {     "contacts": [1,2]   },   "person2": {     "contacts": []   } } 

and contacts2.json

{   "person1": {     "contacts": [3,4]   },   "person2": {     "contacts": [100]   } } 

and your MappedContacts

class MappedContacts {         @JsonMerge         List<Integer> contacts;          public List<Integer> getContacts() {             return contacts;         }          public void setContacts(List<Integer> contacts) {             this.contacts = contacts;         }          @Override         public String toString() {             return contacts.toString();         }     } 

Then to test it works, just simple hello jackson merge :

public static void main(String[] args) throws IOException {     TypeReference<Map<String, MappedContacts>> type = new TypeReference<Map<String, MappedContacts>>() {};     InputStream input = new ClassPathResource("contacts1.json").getInputStream();     InputStream input2 = new ClassPathResource("contacts2.json").getInputStream();     ObjectMapper mapper = new ObjectMapper();     Object contacts = mapper.readValue(input, type);     mapper.readerFor(type)             .withValueToUpdate(contacts)             .readValues(input2);          System.out.println(contacts);     } 

Outputs

{a=[1, 2, 3, 4], b=[100]} 
 
 
0
 
vote
vote
La mejor respuesta
 

Dado que estoy usando Spring, fue bastante fácil de usar func10 para recuperar todos los recursos de una carpeta antes de usar ObjectMapper para transformar cada uno de ellos en un mapa:

  func1111  
 

Since I'm using Spring, it was quite easy to use PathMatchingResourcePatternResolver to retrieve all the resources from a folder before using ObjectMapper to transform each one of them into a map :

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(ConfigMapping.class.getClassLoader());  Resource[] resources = resolver.getResources("classpath*:/META-INF/resources/mapper/*");  for (Resource resource: resources) {  InputStream input = resource.getInputStream();  Map < String, MappedContacts> jsonMap = new ObjectMapper().readValue(input, new TypeReference < Map < String, MappedContacts>> () {});  mapping.putAll(jsonMap); } 
 
 

Relacionados problema

3  ¿Cómo saltar usando @jsoncreator para enumeres durante la deserialización de JSON al objeto Java?  ( How to skip using jsoncreator for enums during deserialization of json to java ) 
Una clase de enumeración, Colorame se genera utilizando JSONSCHEMA2POJO de COLORNAME JSON FILE.SO por defecto, la clase Enum tiene de forma predeterminada Fro...

2  Convertir tipo de cadena JSON a entero con objetos de objeto  ( Convert string type json to integer with objectmapper ) 
Tengo mi clase de modelo class CPOption : Object, Mappable { dynamic var optionId : Int64 = 0 override static func primaryKey() -> String? { return "...

0  Ningún serializador encontrado al serializando un objeto  ( No serializer found when serializing one object ) 
Estoy tratando de devolver un objeto como JSON. Usando el punto final /user/id , quiero mostrar un usuario según su identificación. Al llamar a este controlT...

0  ¿Cómo evitar las comillas dobles en el campo de valor de JSON al analizar con Java?  ( How to avoid double quotes in json value field while parsing using java ) 
Estoy usando un Mapper Objeto proporcionado por Jackson para analizar mi mensaje JSON. El siguiente código funciona para JSONMSG1, pero no funciona para JSO...

0  Valores de múltiples objetos de Mockito  ( Mockito multiple objectmapper values ) 
im Mocking Mapper.ConvertValue para devolver 2 Tipo de devolución diferente de la misma clase. Target target1 = new Target(); target1.setId("123); Target ...

4  Mapeo a un problema de objeto SWIFT que muestra nil usando Alamofire ObjectMapper  ( Mapping to swift object issue showing nil using alamofire objectmapper ) 
i m Nuevo en el entorno de desarrollo iOS y SWIFT. Estaba tratando de usar Alamofire para tirar de JSON y AlamofireObjectMapper para asignar las colecciones J...

3  Cómo analizar el campo que puede ser una cadena y puede ser una matriz con Jackson  ( How to parse field that may be a string and may be an array with jackson ) 
Soy nuevo con Java y ObjectMapper. Estoy tratando de analizar el campo JSON que es posible que una clave tenga dos tipos, podría ser una cadena o matriz. Ej...

2  Serializa flotadores a JSON en SWIFT sin dejar caer decimal  ( Serialize floats to json in swift without dropping decimal ) 
Escenario: Tengo una API de la base de datos de esquemas que infiere el tipo según JSON pasó a ella. Una vez que la base de datos infiere el esquema, sin emba...

0  Maper de objeto SWIFT Pasando una fecha diferente  ( Swift object mapper passing a different date ) 
Estoy usando objetos de objetos para obtener JSON en objetos, pero cada vez que se establece la fecha en 1970-01-01. No puedo ver cuál es mi problema desde qu...

2  ¿Cómo Mapa Diccionario con claves dinámicas con ObjectMapper?  ( How to map dictionary with dynamic keys with objectmapper ) 
Soy nuevo en el ordenador. Tengo respuesta del servidor: { "123123": 10, "435555": 2, "435333": 8, "567567": 4 } Las teclas (di...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos