簡體   English   中英

使用駱駝路線反序列化 JSON

[英]Deserialize JSON with Camel Routes

我正在嘗試解組由 debezium 在 kafka 主題中生成的 json 數據。

我的方法很簡單,使用 POJO 和 Jackson 庫,但是,由於這個 json 有一個根 object(在“{}”內初始化)它會引發錯誤。

這是收到的 json,我只對有效載荷感興趣:

{
    "schema": {
        "type": "struct",
        "fields": [{
            "type": "double",
            "optional": false,
            "field": "codid"
        }, {
            "type": "string",
            "optional": true,
            "field": "__op"
        }, {
            "type": "string",
            "optional": true,
            "field": "__deleted"
        }],
        "optional": false,
        "name": "demo.RESCUE.Value"
    },
    "payload": {
        "codid": 0.0,
        "__op": "r",
        "__deleted": "false"
    }
}

這是我的路線:

public class Routes extends RouteBuilder{

    public static class MySplitter {
        public List<Payload> splitBody(Rescue data) {
            return data.getPayload().stream().collect(toList());
        }
    }

    @Override
    public void configure() throws Exception {

        from("kafka:{{kafka.source.topic.name}}?brokers={{kafka.bootstrap.address}}&autoOffsetReset=earliest")
        .log("Received body: ${body}")
            .unmarshal().json(JsonLibrary.Jackson, Rescue.class)
            .split().method(MySplitter.class, "splitBody")
            .marshal().json(JsonLibrary.Jackson)
            .convertBodyTo(String.class)
            .log("Output: ${body}");
    }
    
}

並收到錯誤:

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type `java.util.ArrayList<org.demo.pojos.rescue.Payload>` from Object value (token `JsonToken.START_OBJECT`)

如果你只是對payload感興趣,你必須從整個 JSON 中提取這個 object。 例如JSONPath

Camel 支持JSONPath 作為表達式語言 因此,您可以嘗試類似

.log("Received body: ${body}")  // logs the full JSON
.setBody().jsonpathWriteAsString("$.payload")
.log("Reduced body: ${body}")   // should log the new body (only the payload)
...

注意需要添加camel-jsonpath依賴

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-jsonpath</artifactId>
</dependency>

或者如果你使用 SpringBoot

<dependency>
    <groupId>org.apache.camel.springboot</groupId>
    <artifactId>camel-jsonpath-starter</artifactId>
</dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM