我有以下格式的JSON数据。
[{
"id": 16966,
"post": "This is about road!",
"category": "road",
},
.
.
.]
我想根据类别对JSON条目进行分组。因此,我将在一个数据结构中获得所有与道路相关的条目(例如列表)。我知道我可以将数据放入Mongo DB甚至是关系数据库并进行查询。如果不这样做,是否有一些简单的方法可以做到这一点?
答案 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]]
我在文件中添加了一些条目。我猜你也可以编写自己的反序列化程序,以便在你有一个临时列表并直接存储在地图中时摆脱这一步,但你要求一个简单的方法:-)。另请注意,我使用的是java-8和Gson,但您也可以在没有它的情况下实现此目的(但您要编写更多代码)。
答案 1 :(得分:2)
看看JXPath。该库允许在java对象的集合上运行XPath查询。因此,您可以使用流行的JSON解析器(例如Jackson或Gson)之一将JSON映射到您的Java模型,然后使用JXPath在您的集合上运行XPath查询。
有关详细信息,请参阅此处:http://commons.apache.org/proper/commons-jxpath/