Skip to main content
sesmic
Level 4
August 15, 2022
Solved

Return servlet response as json data.

  • August 15, 2022
  • 9 replies
  • 7008 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);

 

9 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
HeenaMadanCommunity AdvisorAccepted solution
Community Advisor
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);