在JSON对象上使用group-by类型的操作

时间:2014-12-29 08:47:45

标签: java json group-by

我有以下格式的JSON数据。

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

我想根据类别对JSON条目进行分组。因此,我将在一个数据结构中获得所有与道路相关的条目(例如列表)。我知道我可以将数据放入Mongo DB甚至是关系数据库并进行查询。如果不这样做,是否有一些简单的方法可以做到这一点?

2 个答案:

答案 0 :(得分:5)

如果您要阅读整个JSON文件,一种简单的方法是首先将所有条目读入List<Data>,然后将它们分组到Map<String, List<Data>>

class Data {
    private int id;
    private String post;
    private String category;

    //getter, equals, hashcode, toString, etc.
}

然后:

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]]

我在文件中添加了一些条目。我猜你也可以编写自己的反序列化程序,以便在你有一个临时列表并直接存储在地图中时摆脱这一步,但你要求一个简单的方法:-)。另请注意,我使用的是和Gson,但您也可以在没有它的情况下实现此目的(但您要编写更多代码)。

答案 1 :(得分:2)

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

有关详细信息,请参阅此处:http://commons.apache.org/proper/commons-jxpath/