来自RESTFul的Json

时间:2017-01-18 02:09:45

标签: java json spring rest

我试图创建应该返回的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}]}

有人能帮帮我吗?

4 个答案:

答案 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}