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

春云流处理器 单输入多行输出

空俊语
2023-03-14

我一直在尝试从 kafka 流式传输我的 json 事件,将其展平,然后使用 Spring Cloud 流将其推送回另一个主题。

输入:

{
    "major": "Computer Science",
    "books": [{
        "title": "Learn C",
        "author": "Prof C"
    },
    {
        "title": "Learn Java",
        "author": "Java Expert"
    },{
        "title": "Learn Python",
        "author": "Python Master"
    },]
}

压平工艺:

@ServiceActivator(inputChannel = Sink.INPUT, outputChannel = Source.OUTPUT)
public String(String event){
    JSONArray result = new JSONArray();

    JSONObject rawEvent = new JSONObject(event);

    String major = rawEvent.get("major");
    JSONArray books = rawEvent.get("books");

    for (int i = 0; i < books.length; i++){
        JSONObject book = books.get(i);
        book.put("major", major);
        result.put(book)
    }

    return result.toString();
}

仅产生:

    [{"major":"Computer Science", "books.title":"Learn C", "books.author":"Prof C"}, 
{"major":"Computer Science", "books.title":"Learn Java", "books.author":"Java Expert"}, 
{"major":"Computer Science", "books.title":"Learn Python", "books.author":"Python Master"}]

我的问题是怎么让它变成这样

{"major":"Computer Science", "books.title":"Learn C", "books.author":"Prof C"}
{"major":"Computer Science", "books.title":"Learn Java", "books.author":"Java Expert"}
{"major":"Computer Science", "books.title":"Learn Python", "books.author":"Python Master"}

所以我可以像我所做的那样推回残缺的 JSONObject 而不是单个 JSONArray?

尽管如此,Spring Cloud Stream输出只是一个单独的事件,不适合我上面的案例,无法为Kafka生成3个事件。

谢谢你。

共有2个答案

谢财
2023-03-14

您生成的是一个有效的JSON数组。您试图生成的不是有效的JSON。但是只要你同意,你就可以简单地使用StringBuilder并把每个< i>book.toString()附加到它上面(而不是JSONArray)。那至少会产生你要找的东西。

此外,这确实不是一个与Spring Cloud Stream相关的问题,而是一个普通的Java/JSON问题,所以我认为StackOverflow上有更多特定的论坛可以为您提供更好的答案。

萧明贤
2023-03-14

的确,我误解了。所以在本例中,我建议引入Spring集成和企业集成模式。你基本上对Splitter有一个明确的理由。有很多例子,但这里有一个简短的片段:@Splitter public List

 类似资料:
  • 我有一个常见的任务问题,我可以找到任何解决方案或帮助(也许我需要传递一些属性来工作?)我使用本地服务器1.3.0.M2并创建简单的流 在日志中,我得到了这个: 2017-09-28 12:31:00.644 信息 5156 --- [ -C-1] o.. a.k.c.c.internals.AbstractCoordinator : 成功加入第 1 代的组测试 2017-09-28 12:31:0

  • 先来看一个表单递交的例子,我们有如下的表单内容,命名成文件login.gtpl(放入当前新建项目的目录里面) <html> <head> <title></title> </head> <body> <form action="/login" method="post"> 用户名:<input type="text" name="username"> 密码:<input type=

  • 主要内容:重定向输出(Stdout和Stderr),抑制程序输出有三个键盘输入的通用“文件”,在屏幕上打印文本和在屏幕上打印错误。 标准输入文件(stdin)包含程序/脚本的输入。 标准输出(Standard Out)文件(stdout)被用来写输出以显示在屏幕上。 最后一种叫作的“标准错误”文件包含用于显示在屏幕上的任何错误消息。 这三个标准文件中的每一个(也称为标准流)分别使用数字,和进行引用。Stdin是文件,stdout是文件,stderr是文件。 重

  • 问题内容: 我有以下形式的文本输入: 我试图让它接受多行输入。宽度和高度会使框变大,但用户可以输入所有想要的文本,但它只能填充一行。 如何使输入更像文本区域? 问题答案: 您需要使用文本区域进行多行处理。

  • 我正在开发一个应用程序(控制台),其中包含一个while循环,我希望允许用户暂停和恢复。经过一些研究,似乎一个额外的线程负责等待用户输入是正确的解决方案。 我已经能够实现持续等待输入的额外线程,并且还有一个kill方法,它设置flag变量来停止线程while()循环。不幸的是,除非有输入,否则while循环不会结束,只有在输入线程的while环至少完成一次后,这个kill标志才会生效。由于主线程也

  • 嗨,当一个新的实例/服务使用Spring cloud API注册到eureka时,我试图调用一个自定义方法。是否有任何处理程序/拦截程序可用于执行此操作?在完成注册后,它应该调用自定义方法,这里我试图将一个事件发布到队列中。