我试图创建应该返回的Spring Restful Service:
{"计数":[{" SearchText1":11},{" SearchText2":16},{" SearchText3": 8}]}
Where" SearchText1"是要在文档中搜索的文本,11是重复次数。
我一直在尝试将这个Json建模为java类来返回,所以它可以被序列化为Json但是还没有运气!
public class CountResultWrapper {
List<CountResult> counts = new ArrayList<CountResult>();
public List<CountResult> getCounts() {
return counts;
}
public void setCounts(List<CountResult> counts) {
this.counts = counts;
}
}
public class CountResult {
String searchText;
Integer count;
public CountResult(String searchText,Integer count)
{
this.searchText = searchText;
this.count = count;
}
public String getSearchText() {
return searchText;
}
public void setSearchText(String searchText) {
this.searchText = searchText;
}
public Integer getCount() {
return count;
}
public void setCount(Integer count) {
this.count = count;
}
}
但我明白了:
{"counts":[{"searchText":"searchText1","count":11},{"searchText":"searchText2","count":8},{"searchText":"searchText3","count":7}]}
有人能帮帮我吗?
答案 0 :(得分:1)
由于字段名称是动态的,因此无法使用模型类直接实现 - 因为您不能为每个搜索文本记录创建新字段。
然而,它可以通过以下方式实现 - 对于大容量而言可能是昂贵的,但它会返回预期的输出
List<HashMap<String, Integer>> counts = new ArrayList<>();
counts.add(new HashMap<String, Integer>() {{put("SearchText1",11);}});
counts.add(new HashMap<String, Integer>() {{put("SearchText2",11);}});
JSONObject output = new JSONObject();
output.put("counts",counts);
System.out.println(output.toString());
输出:
{ "counts": [{ "SearchText1": 11 }, { "SearchText2": 16 }, { "SearchText3": 8 }] }
答案 1 :(得分:0)
您可以添加此类并使用。该响应为响应提供json输出。但是您不想要http响应,那么返回类型可以更改为JSONObject输出。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.http.ResponseEntity;
public class JesonCreater {
public ResponseEntity<?> responseProvider(CountResultWrapper wrapper){
Map<String,List<HashMap<String, Integer>>> responseMap=new HashMap<>();
List<CountResult> counts=wrapper.getCounts();
List<HashMap<String, Integer>> countListMap = new ArrayList<>();
for (CountResult count : counts) {
HashMap<String, Integer> countMap=new HashMap<>();
countMap.put(count.getSearchText(), count.getCount());
countListMap.add(countMap);
}
responseMap.put("count", countListMap);
return ResponseEntity.ok(responseMap);
}
}
答案是这样的
{
"count": [
{
"searchText2": 4
},
{
"searchText1": 11
}
]
}
答案 2 :(得分:0)
这就是我解决它的方法:
List<HashMap<String, Integer>> countsList = new ArrayList<>();
searchTexts.forEach(searchText ->{
countsList.add(new HashMap<String, Integer>()
{{put(searchText,countMap.get(searchText.toUpperCase()) == null ? 0 : countMap.get(searchText.toUpperCase()));}});
});
Map<String, List<HashMap<String, Integer>>> response = new HashMap<>();
response.put("counts", countsList);
答案 3 :(得分:-1)
我必须告诉你,你不能以这种方式获得你想要的结果。控制台输出适合您的情况。将ConutResult
转换为json对象时,字段名称将放入key
,字段值将放入value
。像:
{"searchText":"xxx", "count":xxx}
如果你真的想这样做,你可能需要3个课程:
class CountResult1{
private int searchText1;
}
class CountResult2{
private int searchText2;
}
class CountResult3{
private int searchText3;
}
然后可以将3个类转换为:
{"searchText1":xxx}, {"searchText2":xxx}, {"searchText3":xxx}