Spring Boot 扁平化或规范化部分JSON记录

mwecs4sa  于 9个月前  发布在  Spring
关注(0)|答案(1)|浏览(79)

我有一个Sping Boot 记录集,其中包含几个包含相同值的字段。我将在HTTP响应对象中以JSON的形式返回此数据。每行中的公共字段(记录的前X个字段)应该是唯一的,然后其他字段应该作为数组返回。在此之前,先有先有后。
我目前拥有的:

{
    "Field1":"Foo",
    "Field2":"Bar",
    "Field3":"Fizz",
    "Field4":"Buzz",
    "Field5":"John",
    "Field6":"Smith",
    "Field7":"24",
    "Field8":"Ohio"
}

{
    "Field1":"Foo",
    "Field2":"Bar",
    "Field3":"Fizz",
    "Field4":"Buzz",
    "Field5":"Michael",
    "Field6":"Jackson",
    "Field7":"38",
    "Field8":"California"
}

{
    "Field1":"Foo",
    "Field2":"Bar",
    "Field3":"Fizz",
    "Field4":"Buzz",
    "Field5":"Tim",
    "Field6":"Burton",
    "Field7":"45",
    "Field8":"New York"
}

我想把这个数据信息:

{
    "Field1":"Foo",
    "Field2":"Bar",
    "Field3":"Fizz",
    "Field4":"Buzz",
        [
            {"Field5":"John","Field6":"Smith","Field7":"24","Field8":"Ohio"},
            {"Field5":"Michael","Field6":"Jackson","Field7":"38","Field8":"California"},
            {"Field5":"Tim","Field6":"Burton","Field7":"45","Field8":"New York"}
    ]
}

有没有什么神奇的java指令或注解可以做到这一点?我对这门语言很陌生,我已经对它有这么多非常有用的内置程序感到惊讶,所以我希望魔术帽里还有另一只兔子。当然,我可以手动编写逻辑来完成这项工作,但如果存在这样一种机制,我相信它的性能将远远超过我所能编写的任何东西。
感谢您的帮助!

nwo49xxi

nwo49xxi1#

没有现成的解决方案,但是,您可以从流API和java 16记录中受益。顺便说一句,记录甚至可以在任何方法实现中本地定义。

record CommonFields(String field1, String field2, ...) {
    }
    record OtherFields(String field5, String field6, ...) {
    }

    Map<CommonFields, List<OtherFields>> groupedRecords = inputList.stream()
            .map(e -> Map.entry(new CommonFields(e.getField1(), e.getField2()), new OtherFields(e.getField5(), e.getField6())))
            .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

有了这样一个Map,你可以验证是否有单个条目,然后从它构建一个目标自定义对象(也可以是一个记录),或者构建一个JsonNode。Target对象和JsonNode可以手动序列化或传递到Spring框架,通常会发生默认序列化。

相关问题