cancel
Showing results for 
Search instead for 
Did you mean: 

Custom Snap- Get response in json format

DharaSP
New Contributor

I am developing a custom SNAP that makes HTTP request and gets JSON response in return. The response is array of objects. In order to right it to document , currently it only shows up if I convert the response to string in following manner:

Map<String, Object> data = new LinkedHashMap<>();
data.put(“Response”, response);
outputViews.write(documentUtility.newDocumentFor(document, data));

But I’d like to instead preview the response in standard json format in outputview. Any idea how this can be achieved ? Any help would be appreciated . Thank you!

1 ACCEPTED SOLUTION

ptaylor
Employee
Employee

Yes, you’ll want to use the Jackson library’s ObjectMapper class for that.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
...
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final TypeReference<Object> TYPE_REF = new TypeReference<Object>() {};
...
Object parsedResponse = OBJECT_MAPPER.readValue(response, TYPE_REF);

Note there are other versions of the readValue method that take a Reader or InputStream, which means you might be able to avoid reading the entire response as a String.

Hope that helps.

View solution in original post

21 REPLIES 21

ptaylor
Employee
Employee

What is response’s data type? String?

Yes- The response is of type string
Screen Shot 2021-05-11 at 11.26.46 AM

This is the structured response I get when using CORE REST GET SNAP.

But with custom snap- I am unable to get the similar structure. What am I missing?

ptaylor
Employee
Employee

Yes, you’ll want to use the Jackson library’s ObjectMapper class for that.

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.type.TypeReference;
...
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
private static final TypeReference<Object> TYPE_REF = new TypeReference<Object>() {};
...
Object parsedResponse = OBJECT_MAPPER.readValue(response, TYPE_REF);

Note there are other versions of the readValue method that take a Reader or InputStream, which means you might be able to avoid reading the entire response as a String.

Hope that helps.

DharaSP
New Contributor

I’ll try that.
The final step would be to add parsedResponse to Map - something like this:

Map<String, Object> data = new LinkedHashMap<>();
data.put(“Response”, parsedResponse);
outputViews.write(documentUtility.newDocumentFor(document, data)) - right ?