将JSONArray转换为列表<;HashMap<;字符串,对象>&燃气轮机;在没有GSON的java中
我有一个来自将JSONArray转换为列表<;HashMap<;字符串,对象>&燃气轮机;在没有GSON的java中,java,json,list,java-8,hashmap,Java,Json,List,Java 8,Hashmap,我有一个来自net.minidev.json的JSONArray,我想把它转换成列表 使用Gson转换JSONArray有很多答案 但是,我不能将Gson作为依赖项添加到我的pom.xml,因此我正在寻找一种方法,用Java-8特性来实现它 我的JSONArray是这样的:它由多个层次结构组成 [ { "data": { "name": "idris" }, "children": [ { "processStandardDed
net.minidev.json
的JSONArray
,我想把它转换成列表
使用Gson
转换JSONArray
有很多答案
但是,我不能将Gson
作为依赖项添加到我的pom.xml
,因此我正在寻找一种方法,用Java-8特性来实现它
我的JSONArray
是这样的:它由多个层次结构组成
[
{
"data": {
"name": "idris"
},
"children": [
{
"processStandardDeduction": 69394,
"cropId": 1,
"data": null,
"expectedQuantityPerAcre": 1220,
"name": "Red Tomato 1 quality",
"id": 1003,
"autoArchivePlotDays": 59902
},
{
"processStandardDeduction": 69394,
"cropId": 1,
"autoArchivePlotDays": 59902
},
{
"processStandardDeduction": 69394,
"cropId": 1,
"autoArchivePlotDays": 59902
}
],
"name": "Red Tomato",
"id": 1002
},
{
"data": null,
"name": "Red Tomato 1 quality",
"id": 1003,
"processStandardDeduction": 69394,
"cropId": 1,
"expectedQuantityPerAcre": 1220,
"cropName": "Tomato",
"autoArchivePlotDays": 59902
},
{
"data": null,
"name": "Red Tomato 3 quality",
"id": 1001,
"processStandardDeduction": 69394,
"autoArchivePlotDays": 59902
},
{
"processStandardDeduction": 69394,
"cropId": 1,
"data": null,
"id": 1004,
"autoArchivePlotDays": 59902
}
]
我希望在列表中实现相同的结构>
我尝试循环JSONArray的每个元素,将其转换为每个HashMap
,然后将其添加到列表中
ObjectMapper mapper=new ObjectMapper();
List cropDetailsList=新的ArrayList();
对于(对象eachCropJson:cropDetails){//cropDetails是JSONArray
HashMap eachCropMap=(HashMap)mapper.convertValue(eachCropJson,
HashMap.class);
cropDetailsList.add(每个cropMap);
}
返回cropDetailsList;
我想尝试一种更好的方法,在不使用forEach的情况下使用Java-8特性。
提前谢谢 如果您将此JSON
作为String
获取,则可以使用ObjectMapper.readValue
方法
readValue(String content, TypeReference valueTypeRef)
代码
List<HashMap<String, Object>> cropDetailsList = mapper.readValue(jsonString,
new TypeReference<List<HashMap<String, Object>>>(){});
使用流可以做到这一点
List<HashMap<String, Object>> output = cropDetails.toList().stream().map(m -> ((HashMap<String, Object>) m)).collect(Collectors.toList());
List output=cropDetails.toList().stream().map(m->((HashMap)m)).collect(Collectors.toList());
只需使用map
和收集就可以了cropDetails.stream().map(eachCropMap->(map)mapper.convertValue(eachCropJson,HashMap.class)).collect(Collectors.toList())
将JSONArray转换为字符串难道不会成为一项代价高昂的操作吗?如果不是,那么我将使用这种方法。因为我已经在使用映射器将JSONArray的每个对象转换为HashMap,所以我不确定哪种方法在性能方面更好。我认为这不是一个代价高昂的操作,toString()
应该适用于@MohammedIdris,但我也给了您第二种方法,您可以避免这种类型转换(HashMap)
在mohammedidris进行一些谷歌搜索第一种方法似乎如预期的那样有效。但是,StreamSupport.stream
表示方法流(Spliterator,boolean)不适用于参数(JSONArray,boolean)
。我是否使用cast(拆分器)
或(拆分器)
?此外,类型铸造是一个坏主意吗@DeadpoolIt与更新的答案正常工作。谢谢@DeadpoolcropDetails
是一个JSONArray
toList()
函数未定义类型JSONArray
@SUMIT Naviusing stream oncropDetails JSONArray
给了我预期的结果。
List<HashMap<String, Object>> cropDetailsList = cropDetails.stream()
.map(eachCropJson->(HashMap<String, Object>) mapper.convertValue(eachCropJson, HashMap.class))
.collect(Collectors.toList());
List<HashMap<String, Object>> output = cropDetails.toList().stream().map(m -> ((HashMap<String, Object>) m)).collect(Collectors.toList());