当前位置: 首页 > 知识库问答 >
问题:

如何在apachecamel中拆分json数组

夏侯自珍
2023-03-14

我从基于apache-camel-spark的rest接口获得一个json数组作为输入。开始时,我想通过apache camels路线分割json-array来处理每个元素。我该怎么做?

我的测试输入json:

[
  {
      "document": {
        "name": "blub1",
        "type": "pdf"
      }
  },
  {
      "document": {
        "name": "blub2",
        "type": "pdf"
      }
  }
];

对于这个问题,我在stackoverflow上找到了一些间接描述的问题:
link 1, link 2, link 3。

根据这些示例,我尝试了以下骆驼路线:

restConfiguration().component("spark-rest").port(8080)
  .bindingMode(RestBindingMode.json)
  .dataFormatProperty("prettyPrint", "true");

rest("/v1/users").consumes("application/json").produces("application/json")
  .post("/insert")
  .to("direct:split");

from("direct:split")
  .marshal().json(JsonLibrary.Jackson)
  .split(new JsonPathExpression("$..document.")).process(new Processor() {
      public void process(Exchange exchange) throws Exception {
         String s = exchange.getIn().getBody(String.class);
         System.out.println(s);
      }
   }).to("file:outbox");

当我这样做时,我总是得到以下例外:

ERROR DefaultErrorHandler - (MessageId: [...] on ExchangeId: [...]) 的传递失败。尝试传递后耗尽:1 捕获:org.apache.camel.ExpressionEvaluationException:java.lang.NullPointerException

我没有找到原因,我的表情是怎么回事?我改变了它,但我总是得到NullPointer异常。

我下载了JavaScript jsonPath库并测试了$..文档表达式,它为我提供了一个包含两个对象的数组。我也在camel中尝试过,它表示在测试输入json中找到了表达式(返回true):

from("direct:testExpression")
        .marshal().json(JsonLibrary.Jackson)
        .choice()
            .when().jsonpath("$..document.", true)
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                String payload = exchange.getIn().getBody(String.class);
                exchange.getIn().setBody("true");
                System.out.println(payload);
                }
            })
            .to("file:outbox")
        .otherwise()
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                String payload = exchange.getIn().getBody(String.class);
                exchange.getIn().setBody("false");
                System.out.println(payload);
                }
            })
            .to("file:outbox");

我做错了什么,为什么会得到NullPointerException,以及如何拆分json

这里是完整的Stacktrace:

org.apache.camel.ExpressionEvaluationException: java.lang.NullPointerException
    at org.apache.camel.jsonpath.JsonPathExpression.evaluate(JsonPathExpression.java:95) ~[camel-jsonpath-2.18.0.jar:2.18.0]
    at org.apache.camel.support.ExpressionAdapter.evaluate(ExpressionAdapter.java:36) ~[camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.Splitter.createProcessorExchangePairs(Splitter.java:113) ~[camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:231) ~[camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.Splitter.process(Splitter.java:108) ~[camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) ~[camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.processor.DelegateAsyncProcessor.process(DelegateAsyncProcessor.java:97) [camel-core-2.18.0.jar:2.18.0]
    at org.apache.camel.component.sparkrest.CamelSparkRoute.handle(CamelSparkRoute.java:46) [camel-spark-rest-2.18.0.jar:2.18.0]
    at spark.RouteImpl$1.handle(RouteImpl.java:58) [spark-core-2.3.jar:?]
    at spark.webserver.MatcherFilter.doFilter(MatcherFilter.java:162) [spark-core-2.3.jar:?]
    at spark.webserver.JettyHandler.doHandle(JettyHandler.java:61) [spark-core-2.3.jar:?]
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:189) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.server.Server.handle(Server.java:499) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:311) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) [jetty-server-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:544) [jetty-io-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) [jetty-util-9.2.19.v20160908.jar:9.2.19.v20160908]
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) [jetty-util-9.2.19.v20160908.jar:9.2.19.v20160908]
    at java.lang.Thread.run(Thread.java:745) [?:1.8.0_101]
Caused by: java.lang.NullPointerException
    at org.apache.camel.jsonpath.JsonPathExpression.evaluateJsonPath(JsonPathExpression.java:118) ~[camel-jsonpath-2.18.0.jar:2.18.0]
    at org.apache.camel.jsonpath.JsonPathExpression.evaluate(JsonPathExpression.java:88) ~[camel-jsonpath-2.18.0.jar:2.18.0]
    ... 31 more

共有1个答案

慕凡
2023-03-14

尝试创建您的jsonpath表达类似于:

ExpressionBuilder.languageExpression("jsonpath","$..document.") 

把它放在你的分开的地方试试。在进行各种条件求值时,我用这种方式使用jsonpath取得了更大的成功。

 类似资料:
  • 如何拆分阵列?例如,我有一个如下字符数组: 现在,我想用位置6上可以看到的空格拆分数组。拆分后数组将如下所示: 我确实在这里找到了类似的帖子,但在java或Kotlin中没有。 我知道我可以这样做: 但是,如果可能的话,我想要另一种方式。这占用了大量内存,在大型数组上也需要大约30-40毫秒 如何使用java或静态编程语言做到这一点

  • 我正在编写一个应用程序,它从Timezonedb API中提取数据,以获得可用时区列表: https://timezonedb.com/references/list-time-zone TableViewController: 感谢任何帮助。谢谢你。

  • 问题内容: 运行此查询时: 我得到一个这样的表: 我现在想做的是获取相同的信息,但是将数组分成几行,所以我得到的结果是这样的: 如您所见,我不想在“ selected_placements”中获取具有空值的行。 我正在使用PostgreSQL 8.0.2。 非常感谢! 问题答案: 我建议您升级Postgres版本。所有受支持的版本均支持: 在早期版本中,您可以尝试一次将它们选出来。尽管已在9.5中

  • 我已经在这里问了一个问题,但是这个问题只回答了字符串。我不能编辑它,因为那里已经有几个答案了。 现在,我明白了如何用那篇文章中给出的空格分割它。但是,我如何用像这样的自定义类对象分割它: 现在,我想在为false的地方拆分。例如,我有这个数组: 现在,如果将isAdult拆分为false,则如下所示: 那么,如何在java或静态编程语言中实现这一点

  • 我正在使用Flink处理来自某些数据源(如Kafka、Pravega等)的数据。 在我的例子中,数据源是Pravega,它为我提供了一个flink连接器。 我的数据源正在向我发送一些JSON数据,如下所示: 以下是我的代码: 如您所见,我使用FlinkPravegaReader和适当的反序列化程序来获取来自Pravega的JSON流。 然后我尝试将JSON数据转换为String,它们并对它们进行计

  • 问题内容: Mac是否有任何应用程序可以拆分sql文件甚至脚本?我有一个大文件,我必须将其上传到不支持8 MB以上文件的主机。 *我没有SSH访问权限 问题答案: 您可以使用此:http : //www.ozerov.de/bigdump/ 或者 使用此命令拆分sql文件 split命令获取一个文件并将其分成多个文件。-l 5000部分告诉它每五千行分割一次文件。下一部分是文件的路径,下一部分是要