Return servlet response as json data. | Community
Skip to main content
sesmic
Level 4
August 15, 2022
Solved

Return servlet response as json data.

  • August 15, 2022
  • 6 replies
  • 6926 views

I'm working on servlet registered on path & wanted to return its content in json data.
Currently, my servlet is fetching data from 

"/content/myproject/language-masters/en/jcr:content/root/container/container/componentname". Here values in component are injected via model & same used for servlet. I'm referring this blog. This is my code:@9944223 protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) { try { ResourceResolver resourceResolver = request.getResourceResolver(); Resource resource = resourceResolver.getResource("/content/myproject/language-masters/en/jcr:content/root/container/container/mycomponent"); ProductDetails model = resource.adaptTo(ProductDetails.class); response.getWriter().print("Product Specs are =>\n\nProduct Name: " + model.getName() + "\nPhone Ram: " + model.getRam() + "\nLaptop OS: " + model.getOs() + "\nTV Screensize: "+ model.getSize() + "\nWatch Dial Shape: " + model.getShape() + "\nProduct Prices: "+ model.getPrice()); resourceResolver.close(); } catch

and its working good, displaying text. 

But for current requirement, I want to return this as json data(need necessary not to be in key:value pair, just json data anyway) in response. So, please tell me how can I do this?

This post is no longer active and is closed to new replies. Need help? Start a new post to ask your question.
Best answer by HeenaMadan

You can use google.gson api to pass json in response. try this.

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {

ResourceResolver resourceResolver = request.getResourceResolver();

Resource resource = resourceResolver.getResource("/content/myproject/language-masters/en/jcr:content/root/container/container/mycomponent");

ProductDetails productDetails = ProductDetails.builder().id("component-id").name("modelname").build();

String jsonString = this.gson.toJson(productDetails);


PrintWriter out = response.getWriter();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        out.print(jsonString);
        out.flush();
}
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

@Builder
@Data
public class ProductDetails implements Serializable {
    private int id;
    private String name;
}

If you don't want to use lombok then use entity class like this

public class ProductDetails {
	private String id;
        private String name;
    //Getters/Setters
    }

and ProductDetails product = new ProductDetails("component-id", "model name");

String jsonString = this.gson.toJson(product);

 

6 replies

tb1687196
Level 2
August 16, 2022

Hi @sesmic ,

 

You can do it by jackson or Gson parsing. You will get many examples over internet about the process.

sesmic
sesmicAuthor
Level 4
August 16, 2022

Thanks for replying. Sorry, but I don't know how to use them. Can you give some hint please?

 

Mohit_KBansal
Adobe Employee
Adobe Employee
August 16, 2022

Check this sample code [1] 

 

[1] https://gist.github.com/nateyolles/d4ca683078efd60aa8ac 

sesmic
sesmicAuthor
Level 4
August 16, 2022

Thanks for the reply.
I can't understand about how can I adapt it to my code.

 

Mohit_KBansal
Adobe Employee
Adobe Employee
August 16, 2022

@sesmic Here is another simple example which you can follow [1], this example uses gson.

public class EmployeeServlet extends HttpServlet {

    private Gson gson = new Gson();

    @Override
    protected void doGet(
      HttpServletRequest request, 
      HttpServletResponse response) throws IOException {
        Employee employee = new Employee(1, "Emp name", "IT", 5000);
        String employeeJsonString = this.gson.toJson(employee);

        PrintWriter out = response.getWriter();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        out.print(employeeJsonString);
        out.flush();   
    }
}

[1] https://www.baeldung.com/servlet-json-response

arunpatidar
Community Advisor
Community Advisor
August 16, 2022

Hi,

You can do json export from model or via public method expose json from model and access in servlet

https://experienceleague.adobe.com/docs/experience-manager-64/developing/components/json-exporter-components.html?lang=en 

Arun Patidar
B_Sravan
Community Advisor
Community Advisor
August 16, 2022

Hi @sesmic,

 

As suggested by @mohit_kbansal, you can get your data in JSON, but are you using servlet just for that?
I would recommend using Sling Exporters to have your data in an easier way.

 

check this: https://experienceleague.adobe.com/docs/experience-manager-learn/foundation/development/develop-sling-model-exporter.html?lang=en 

 

Thanks,

Sravan

sesmic
sesmicAuthor
Level 4
August 16, 2022

Thanks all! I imported com.google.gson.Gson and added values to json (String myJsonString = this.gson.toJson(model);) then object out.print(myJsonString).

 
HeenaMadan
Community Advisor and Adobe Champion
HeenaMadanCommunity Advisor and Adobe ChampionAccepted solution
Community Advisor and Adobe Champion
August 16, 2022

You can use google.gson api to pass json in response. try this.

@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) {

ResourceResolver resourceResolver = request.getResourceResolver();

Resource resource = resourceResolver.getResource("/content/myproject/language-masters/en/jcr:content/root/container/container/mycomponent");

ProductDetails productDetails = ProductDetails.builder().id("component-id").name("modelname").build();

String jsonString = this.gson.toJson(productDetails);


PrintWriter out = response.getWriter();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        out.print(jsonString);
        out.flush();
}
import lombok.Builder;
import lombok.Data;

import java.io.Serializable;

@Builder
@Data
public class ProductDetails implements Serializable {
    private int id;
    private String name;
}

If you don't want to use lombok then use entity class like this

public class ProductDetails {
	private String id;
        private String name;
    //Getters/Setters
    }

and ProductDetails product = new ProductDetails("component-id", "model name");

String jsonString = this.gson.toJson(product);