有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

json java流逗号分隔

我有一连串的弦。每个字符串表示json对象,如下所示,例如:

// {"foo": "bar", "bar": "foo"}
String s1 = "{\"foo\": \"bar\", \"bar\": \"foo\"}";

我从数据库中获取大量数据,这就是我使用Stream的原因。 我想将这些数据流式传输到http响应的输出

try (Stream<String> data = service.streamData()) {
            os.write("[".getBytes());
            eventStream.forEach(s -> {
                        try {
                            os.write(s.getBytes());
                            os.write(",".getBytes());
                            os.write("\n".getBytes());
                        } catch (IOException e) {
                            logger.error(e.getMessage());
                        }
                    });
        }
        os.write("{}]".getBytes());
        os.flush();

因为每个字符串代表一个json对象,所以我想返回这些对象的数组。在这种情况下,我必须手动添加"[""]",并使用逗号分隔流中的每个元素。但最终我会在最新的元素后面加一个逗号。这将不是一个有效的json

看起来是这样的:

["{"foo": "bar", "bar": "foo"}", "{"foo": "bar1", "bar": "foo1"}",]

你知道如何使用流删除最新的逗号吗


共 (1) 个答案

  1. # 1 楼答案

    注意,虽然lambda表达式是一个整洁的特性,但匿名内部类并没有停止存在。如果您需要一个有状态的消费者,它们是正确的工具。这里甚至不需要条件:

    stream.forEach(new Consumer<String>() {
        int header = '[';
        public void accept(String string) {
            try {
                os.write(header);
                os.write('\n');
                os.write(string.getBytes(StandardCharsets.UTF_8));
                header=',';
            } catch (IOException e) {
                logger.error(e.getMessage());
            }
        }
    });
    os.write('\n');
    os.write(']');
    

    如果您必须处理空流,您可以将其扩展到

    os.write('[');
    stream.forEach(new Consumer<String>() {
        int header = ' ';
        public void accept(String string) {
            try {
                os.write(header);
                os.write('\n');
                os.write(string.getBytes(StandardCharsets.UTF_8));
                header=',';
            } catch (IOException e) {
                //logger.error(e.getMessage());
            }
        }
    });
    os.write('\n');
    os.write(']');