Java 对JSON对象使用按类型分组的操作

Java 对JSON对象使用按类型分组的操作,java,json,group-by,java-8,Java,Json,Group By,Java 8,我有以下格式的JSON数据 [{ "id": 16966, "post": "This is about road!", "category": "road", }, . . .] 我想根据JSON条目的类别对它们进行分组。所以,我将在一个数据结构中获取所有与道路相关的条目,比如列表。我知道我可以将数据放入Mongo DB甚至关系数据库中并进行查询。如果不这样做,有什么简单的方法可以做到这一点吗?看看JXPath。该库允许在java对象集合上运行XPath查询。因此,

我有以下格式的JSON数据

 [{
    "id": 16966,
    "post": "This is about road!",
    "category": "road",
},
.
.
.]

我想根据JSON条目的类别对它们进行分组。所以,我将在一个数据结构中获取所有与道路相关的条目,比如列表。我知道我可以将数据放入Mongo DB甚至关系数据库中并进行查询。如果不这样做,有什么简单的方法可以做到这一点吗?

看看JXPath。该库允许在java对象集合上运行XPath查询。因此,您可以使用流行的JSON解析器(如Jackson或Gson)将JSON映射到java模型,然后使用JXPath对集合运行XPath查询


有关更多信息,请参阅此处:

如果要读取整个JSON文件,一种简单的方法是首先将所有条目读取到一个列表中,然后将它们分组到一个映射中

然后:

public class Test {    
    public static void main(String args[] ) throws Exception {
        Gson gson = new Gson();
        List<Data> list = gson.fromJson(new BufferedReader(new FileReader("myJson.json")), new TypeToken<List<Data>>(){}.getType());
        Map<String, List<Data>> groupedMap = list.stream().collect(Collectors.groupingBy(Data::getCategory));

        groupedMap.forEach((k, v) -> System.out.println(k + " => " + v));
    }    
}
我在文件中添加了一些条目。我想你也可以编写你自己的反序列化程序,当你有一个临时列表并直接存储在映射中时,就可以摆脱这个步骤,但是你要求一个简单的方法:-。还请注意,我使用的是和Gson,但您也可以在没有它的情况下实现这一点,但您将编写更多的代码

public class Test {    
    public static void main(String args[] ) throws Exception {
        Gson gson = new Gson();
        List<Data> list = gson.fromJson(new BufferedReader(new FileReader("myJson.json")), new TypeToken<List<Data>>(){}.getType());
        Map<String, List<Data>> groupedMap = list.stream().collect(Collectors.groupingBy(Data::getCategory));

        groupedMap.forEach((k, v) -> System.out.println(k + " => " + v));
    }    
}
road => [Data [id=16966, post=This is about road!, category=road], Data [id=16965, post=This is about road!, category=road]]
land => [Data [id=16961, post=This is about land!, category=land]]