如何将json对象列表转换为包含每个对象中某些字段的字符串pojo列表?

时间:2018-08-27 09:56:21

标签: java json jackson

我有一个描述对象列表的JSON文档,它看起来像这样:

update t1 set t1.[trasco_tot] = t2.[trasco_tot] from my_table t1
join (select [trasco_id_testdata], sum([Importo a Deb]) [trasco_tot] from my_table group by [trasco_id_testdata]) t2
on t1.[trasco_id_testdata] = t2.[trasco_id_testdata]

如何仅使用Jackson API从每个对象中获取包含[ { "txId": "ffff", "sender" : "0xwwwwwww", "recepient" : "0xeferfef" }, { "txId": "ffff", "sender" : "0xwwwwwww", "recepient" : "0xeferfef" } ... ... ] 值的List<String>(不将此JSON转换为pojo对象列表,然后通过foreach进行此列表创建并创建新列表)字符串)?

1 个答案:

答案 0 :(得分:5)

您始终可以使用Jackson API将JSON文档读取为JsonNode对象(无需创建POJO)。接下来,有几种读取和处理以JsonNode对象表示的数据的方式。 Java 8+提供的最方便的方法之一是创建一个java.util.Stream<JsonNode>并收集从JsonNodeString的映射结果的最终列表,其中String是代表node.txId字段的值。

您可以create java.util.Stream<JsonNode> with

java.util.stream.StreamSupport.stream(jsonNode.spliterator(), false)

然后您可以调用map(node -> node.get("txId").textValue(),最后调用collect()终止流并获得预期的结果。

以下面的代码为例(需要Java 8 +):

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;

final class JacksonReadExample {

    public static void main(String[] args) throws IOException {

        final String json = " [\n" +
                "   {\n" +
                "     \"txId\": \"ffff-001\",\n" +
                "     \"sender\" : \"0xwwwwwww\",\n" +
                "     \"recepient\" : \"0xeferfef\"\n" +
                "   },\n" +
                "   {\n" +
                "     \"txId\": \"ffff-002\",\n" +
                "     \"sender\" : \"0xwwwwwww\",\n" +
                "     \"recepient\" : \"0xeferfef\"\n" +
                "   }\n" +
                "]";

        final ObjectMapper mapper = new ObjectMapper();

        final JsonNode jsonNode = mapper.readTree(json);

        final List<String> ids = StreamSupport.stream(jsonNode.spliterator(), false)
                .map(node -> node.get("txId").textValue())
                .collect(Collectors.toList());

        System.out.println(ids);
    }
}

输出:

[ffff-001, ffff-002]