Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Method returning JSON "empty:false" although this JSON has data

I have java Spring Boot application. In console json have data in(but in wrong order?) and when i'm converting it to String i can get it, but JSONObject cannot be returned, POSTman showing {"empty":false}

My controller package com.example.controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.example.dao.SeriaDao;
import com.example.model.Seria;


@RestController
public class WebController {

    @Autowired
    SeriaDao sed;


    @GetMapping("/tabelka")
    public List<Seria> showTable()
    {
        return sed.findAll();
    }

    @GetMapping("/pgTabelka")
    public JSONObject pgTable(HttpServletRequest request)
    {
        int draw = 0;
        int start = 0;
        int length = 10;

        JSONObject json = new JSONObject();
        if(request.getParameter("draw")!=null)
            draw = Integer.parseInt(request.getParameter("draw"));
        if(request.getParameter("start")!=null)
            start = Integer.parseInt(request.getParameter("start"));
        if(request.getParameter("length")!=null)
            length = Integer.parseInt(request.getParameter("length"));
        int totalRecords = sed.recordsTotal();

        List<Seria> serie = sed.findPart(start, length);

        try {
            json.put("draw", ++draw);
            json.put("recordsTotal", totalRecords);
            json.put("recordsFiltered", totalRecords);
            json.put("data", serie);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        System.out.println(json);

        return json;
    }
}

What i have to add and why i can't get json like i'm trying to get?

PS. json returned in console:

{
  "recordsFiltered": 488,
  "data": [
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "$ per Week",
      "file": "SMU48185800500000011.csv",
      "cassid": "1d2e556b-031e-4c6f-aec4-981c4e907324",
      "name": "Average Weekly Earnings of All Employees: Total Private in Corpus Christi, TX (MSA)",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-01-09T00:50:01",
      "id": 41,
      "datefrom": "2006-12-31",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "Index 2015=100",
      "file": "CP0910CYM086NEST.csv",
      "cassid": "6df5b8d5-ec39-4860-930f-a8b355cce37a",
      "name": "Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Cyprus",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:35:04",
      "id": 42,
      "datefrom": "1995-12-31",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "$ per Week",
      "file": "SMU48185800500000011A.csv",
      "cassid": "c3bad2a6-7ad5-4091-846b-f84e9b9f7b50",
      "name": "Average Weekly Earnings of All Employees: Total Private in Corpus Christi, TX (MSA)",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:32:01",
      "id": 43,
      "datefrom": "2006-12-31",
      "categoryid": 3,
      "frequency": 8
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "Index 2015=100",
      "file": "CP0910CZM086NEST.csv",
      "cassid": "84483d95-d914-45ab-a87a-8c063bfc6d0f",
      "name": "Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Czech Republic",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:35:04",
      "id": 44,
      "datefrom": "1999-11-30",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "$ per Week",
      "file": "SMU41187000500000011SA.csv",
      "cassid": "285056e3-94ce-4266-98b4-ddf32602c0c2",
      "name": "Average Weekly Earnings of All Employees: Total Private in Corvallis, OR (MSA)",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-01-09T00:50:01",
      "id": 45,
      "datefrom": "2006-12-31",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "Index 2015=100",
      "file": "CP0910DKM086NEST.csv",
      "cassid": "9798eadf-1503-48a5-91e3-cad5852db745",
      "name": "Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Denmark",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:35:04",
      "id": 46,
      "datefrom": "1995-12-31",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "$ per Week",
      "file": "SMU41187000500000011.csv",
      "cassid": "d4b22376-2f84-404f-a175-c04ad8ced5a5",
      "name": "Average Weekly Earnings of All Employees: Total Private in Corvallis, OR (MSA)",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-01-09T00:50:01",
      "id": 47,
      "datefrom": "2006-12-31",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "Index 2015=100",
      "file": "CP0910EEM086NEST.csv",
      "cassid": "72880ba0-722e-46bb-98f4-7d388d217c26",
      "name": "Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Estonia",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:35:04",
      "id": 48,
      "datefrom": "1995-12-31",
      "categoryid": 3,
      "frequency": 5
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "$ per Week",
      "file": "SMU41187000500000011A.csv",
      "cassid": "03fdf50e-9cd9-483b-aecf-1a0a9e93fa4d",
      "name": "Average Weekly Earnings of All Employees: Total Private in Corvallis, OR (MSA)",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:32:01",
      "id": 49,
      "datefrom": "2006-12-31",
      "categoryid": 3,
      "frequency": 8
    },
    {
      "feed": "Macroeconomic_And_Major_Markets",
      "unit": "Index 2005=100",
      "file": "CP0910EZ17M086NEST.csv",
      "cassid": "2943c0f2-ad55-4ec4-98d0-70db25deaefc",
      "name": "Harmonized Index of Consumer Prices: Audio-Visual, Photographic, and Information Processing Equipment for Euro area (17 countries) (DISCONTINUED)",
      "createdate": "2016-10-15T23:38:49",
      "changedate": "2017-02-16T11:35:04",
      "id": 50,
      "datefrom": "1995-12-31",
      "categoryid": 3,
      "frequency": 5
    }
  ],
  "draw": 1,
  "recordsTotal": 488
}
like image 948
Wolfik Avatar asked Aug 23 '18 13:08

Wolfik


3 Answers

Spring boot uses jackson as default serializer and you're trying to return JSONObject itself. Jackson does not know how to serialize it.

If you want to return dynamic json you can use Map as below :

@GetMapping("/pgTabelka")
public Map<String, Object> pgTable(HttpServletRequest request)
{
    Map<String, Object> json = new HashMap();

    int draw = 0;
    int start = 0;
    int length = 10;

    if(request.getParameter("draw")!=null)
        draw = Integer.parseInt(request.getParameter("draw"));
    if(request.getParameter("start")!=null)
        start = Integer.parseInt(request.getParameter("start"));
    if(request.getParameter("length")!=null)
        length = Integer.parseInt(request.getParameter("length"));
    int totalRecords = sed.recordsTotal();

    List<Seria> serie = sed.findPart(start, length);

    json.put("draw", ++draw);
    json.put("recordsTotal", totalRecords);
    json.put("recordsFiltered", totalRecords);
    json.put("data", serie);

    return json;
}

Or you can create a class represents your json structure and return your custom data class as your response, spring will handle the rest for you.

@GetMapping("/pgTabelka")
public YourJsonDataClass pgTable(HttpServletRequest request)
{
    ...

    YourJsonDataClass json = new YourJsonDataClass();
    json.setDraw(++draw);
    json.setRecordsTotal(totalRecords);
    json.setRecordsFiltered(totalRecords);
    json.setData(serie);

    return json;
}
like image 94
Emre Savcı Avatar answered Nov 01 '22 01:11

Emre Savcı


Using generic type ResponseEntity<?> combined with json.toString() does the trick.

    @ResponseBody
    public ResponseEntity<?> create(@RequestBody User user) {
        return ResponseEntity.status(HttpStatus.OK).body(json.toString());
    }
like image 44
softwarevamp Avatar answered Nov 01 '22 01:11

softwarevamp


Use HashMap instead of using JSONObject

List<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();

HashMap<String, String> map = new HashMap<>();

map.put(key, value);

myList.add(map);

If you have a ResultSet, you can loop this code thru the rs. It is worth noting that if your HashMap has duplicate keys, you will have to use a Multimap since HashMap doesn't allow duplicate Keys

Multimap<String, String> map = ArrayListMultimap.create();
map.put(key1, "value1");
map.put(key1, "value2");
map.put(key2, "value3");
like image 2
JavaGeek Avatar answered Nov 01 '22 01:11

JavaGeek