JSON Splitter

El JSON Splitter proporcionado por IPF se implementa utilizando el Actson JSON analizador de streaming biblioteca bajo el capó. Toma una jerarquía de componentes, 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 adicional 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 Dependencia

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 potencialmente JSON file s que contienen datos sobre libros en una biblioteca y divídalo en partes más pequeñas, para que puedan ser utilizadas 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.

example.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, podemos decidir dividirlo utilizando la siguiente jerarquía.

library
└── books
    └── chapters

Con estos requisitos previos fuera del camino, 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":[[],[],[]]}}