Skip to content

Dynamic JSON Transformation

Use case

In systems where data interchange involves JSON format, there's a frequent need to transform this data into a structured format suitable for further processing. This use-case outlines the process of dynamically converting JSON data related to orders into Java objects without predefined classes, and subsequently unmarshalling these objects back to JSON format for further processing or interfacing with other systems.

Below is an example of the data format:

incoming.json
{
  "orderId": "12345",
  "customer": {
    "customerId": "67890",
    "name": "Jane Doe",
    "email": "jane.doe@example.com",
    "address": "123 Main St, Anytown, Anystate, 12345"
  },
  "totalAmount": 40.00,
  "orderDate": "2024-03-25",
  "status": "Pending"
}
outgoing.json
{
    "orderId": "12345",
    "customerId": "67890",
    "status": "Pending"
}

Implementation Highlights:

  1. Unmarshall JSON to Dynamic Java Object: Use Jackson to convert JSON data to a dynamic Java object, leveraging Jackson's dynamic binding capabilities.
  2. Modify Using Groovy: Further manipulate the Java object as needed using Groovy, taking advantage of its dynamic nature for flexible data handling.
  3. Marshall to JSON: Convert the modified Java object back to JSON using Jackson, readying it for further processing or output.

Design

Unmarshall JSON to Dynamic Java Object

Image title

Modify Using Groovy

Image title

YAML

routing.camel.yaml
- route:
    id: marshall-route
    description: Dynamic JSON Transformation
    nodePrefixId: route-f0e
    from:
      id: from-6a12
      uri: direct
      parameters:
        name: marshall-route
      steps:
        - unmarshal:
            id: unmarshal-7ea9
            json:
              id: json-daf7
              library: Jackson
        - setBody:
            id: setBody-3e8b
            expression:
              groovy:
                id: groovy-3853
                expression: |-
                  return [
                      orderId: body.orderId,
                      customerId: body.customer.customerId,
                      status: body.status
                  ]
        - marshal:
            id: marshal-4ad3
            json:
              id: json-9474
              library: Jackson

This additional YAML configuration provides a demonstration route that generates a JSON message and sends it to the marshall-route route you previously defined. Let's break down the components of this configuration:

demo.camel.yaml
- route:
    id: route-a1c1
    nodePrefixId: route-13f
    from:
      id: from-fe49
      uri: timer
      parameters:
        timerName: test
      steps:
        - setBody:
            id: setBody-a132
            expression:
              constant:
                id: constant-de93
                expression: |
                  {
                    "orderId": "12345",
                    "customer": {
                      "customerId": "67890",
                      "name": "Jane Doe",
                      "email": "jane.doe@example.com",
                      "address": "123 Main St, Anytown, Anystate, 12345"
                    },
                    "totalAmount": 400.00,
                    "orderDate": "2024-03-25",
                    "status": "Pending"
                  }
        - to:
            id: to-1203
            uri: direct
            parameters:
              name: marshall-route