JSON Splitter

El JSON Splitter proporcionado por IPF se implementa utilizando el Actson JSON analizador de streaming biblioteca bajo el capó. Toma un component hierarchy, definiendo la estructura de JSON elementos a separar.

Vale la pena señalar que el resultado generado JSON Los datos del elemento serán compactados. Es decir, que cualquier espacio en blanco extráneo en el documento original será eliminado de los componentes que se publiquen. Las versiones futuras pueden incluir configuraciones para preservar el formato de origen.

Maven Dependency

Para utilizar el JSON splitter, se debe proporcionar la siguiente dependencia, con una versión que coincida con ipf-debulker-core para garantizar la compatibilidad.

<dependency>
    <groupId>com.iconsolutions.ipf.debulk</groupId>
    <artifactId>ipf-debulker-json-splitter</artifactId>
    <version>${ipf-debulker-core.version}</version>
</dependency>

Ejemplo de Uso

Imagine que queremos procesar grandes cantidades de JSON file s que contienen datos sobre libros en una biblioteca y divídalo en fragmentos más pequeños, para que puedan ser utilizados por algún sistema posterior.

El archivo de ejemplo es pequeño para fines de demostración, pero podría contener un gran número de elementos de libro.

ejemplo.json
{
  "name": "Library of Alexandria",
  "meta": {
    "bookCount": 2,
    "authorCount": 2,
    "mixedValueList": [
      1, {}, 2. 0, [], true, false, null, {}, [], {}
    ],
    "listOfList": [[],[],[]]
  },
  "books": [
    {
      "title": "Clean Code",
      "author": "Martin, Robert",
      "price": 39. 99,
      "chapters": [
        {
          "name": "Clean Code",
          "startPage": 1
        },
        {
          "name": "Meaningful Names",
          "startPage": 17
        }
      ]
    },
    {
      "title": "Effective Java",
      "author": "Bloch, Joshua",
      "price": 55. 00,
      "chapters": [
        {
          "name": "Introduction",
          "startPage": 1,
          "meta": {
            "x": "wow"
          }
        },
        {
          "name": "Creating and Destroying Objects",
          "startPage": 5
        }
      ]
    }
  ]
}

Dado nuestro ejemplo JSON datos, podríamos decidir dividirlo utilizando la siguiente jerarquía.

library
└── books
    └── chapters

Con estos requisitos previos resueltos, escribamos el programa. Tenga en cuenta que este ejemplo utiliza Project Reactor para convertir el Java 9 Flow. Publisher a un Flux para simplificar un poco la suscripción a los datos, pero esto podría ser reemplazado por otra biblioteca reactiva que sea compatible con el Java 9 bibliotecas reactivas, p. ej. Akka Streams o RxJava.

ActorSystem system = ActorSystem.create();
AkkaJsonSplitter splitter = new AkkaJsonSplitter(system);

InputStream stream = getClass().getClassLoader().getResourceAsStream("example.json");

ComponentHierarchy root = ComponentHierarchy.root("$");
ComponentHierarchy book = root.addChild("books[]");
book.addChild("chapters[]");

Flow.Publisher<DebulkComponent> publisher = splitter.split(stream, root);
Flux<DebulkComponent> flux = JdkFlowAdapter.flowPublisherToFlux(publisher);
List<DebulkComponent> components = flux.collectList().blockOptional().orElseThrow();

System.out.println();
components.stream()
        .map(DebulkComponent::getContent)
        .forEach(System.out::println);

Ejecutar este código debería imprimir una serie de componentes extraídos en la consola.

salida
{"name":"Clean Code","startPage":1}
{"name":"Meaningful Names","startPage":17}
{"title":"Clean Code","author":"Martin, Robert","price":39. 99}
{"name":"Introduction","startPage":1,"meta":{"x":"wow"}}
{"name":"Creating and Destroying Objects","startPage":5}
{"title":"Effective Java","author":"Bloch, Joshua","price":55. 0}
{"name":"Library of Alexandria","meta":{"bookCount":2,"authorCount":2,"mixedValueList":[1,{}, 2. 0,[], true,false,null,{},[],{}],"listOfList":[[],[],[]]}}